iOS: изменение названия UIButton через делегат
Я использую делегирование, чтобы изменить название UIButton.
.h MainView
//MainViewController.h
#import <UIKit/UIKit.h>
@class SignUpDelegate;
@protocol SignUpDelegate <NSObject>
@required
-(void)loggedIn;
@end
@interface MainViewController : UITableViewController <NSFetchedResultsControllerDelegate>
{
id <SignUpDelegate> delegate;
}
@property (nonatomic, assign) id <SignUpDelegate> delegate;
-(void)loggedIn;
@end
.m
@interface MainViewController ()
//This button is connected to the UINavigationBar Button that needs its title changed.
//Via Interface Builder, the default value of the title is setup as "Login"
-@property (weak, nonatomic) IBOutlet UIBarButtonItem *logInOutButton;
@end
-(void)loggedIn
{
NSLog (@"This is Logged in inside MainView.m");
self.logInOutButton.title = @"Logout";
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
UIViewController *destinationViewController = segue.destinationViewController;
Signup *signUp = [destinationViewController isKindOfClass:[Signup class]] ? (Signup*)destinationViewController : nil;
signUp.mainViewController = self.delegate;
}
.h Регистрация
#import <UIKit/UIKit.h>
#import "MainViewController.h"
@interface SignUp : UIViewController <UITextFieldDelegate, UIActionSheetDelegate, SignUpDelegate>
@property (strong, nonatomic) MainViewController *mainViewController;
@end
.m
@synthesize mainViewController;
- (IBAction)createUser:(id)sender
{
[self loggedIn];
}
- (void) loggedIn
{
NSLog (@"This is Logged in inside SignUp");
[mainViewController loggedIn];
}
Итак, оба NSLogs печатают нормально, что, я думаю, означает, что делегат работает, однако заголовок на кнопке UIB на панели навигации никогда не меняется на "Выход"
1 ответ
Решение
Это потому, что вы воссоздаете STMasterViewController
(если бы это было MainViewController
вместо этого?) каждый раз в loggedIn
метод делегата. (Вы можете проверить это, добавив точку останова на -[MainViewController loggedIn]
и проверка, если self.logInOutButton
не ноль). Вместо этого вы должны получить ссылку на существующий экземпляр MainViewController
и оперировать этим.