Как изменить название UIButton?

MyViewController имеет один UIButton, а другой MainViewController использует MyViewController.

но MainViewController не может изменить название UIButton в MyViewController.

также, в MyViewController только изменить название UIButton в методе viewDidLoad.

Что случилось?

MyViewController

@interface MyViewcontroller : UIViewController {
    IBOutlet UIButton *imageButton;
}

@property (nonatomic, retain) UIButton *imageButton;

@implementation MyViewcontroller : UIViewController {
@synthesize imageButton;
    - (void)viewDidLoad { // can change button title
        [imageButton setTitle:@"buttonTitle" forState:UIControlStateNormal]
    }

    - (void)setButtonTitle { // can't change button title
        [imageButton setTitle:@"buttonTitle" forState:UIControlStateNormal];
    }
}

MainViewController

@implementation MainViewController : UIViewController {
@synthesize scrollView;
    - (void)viewDidLoad { // can't change button title
        MyViewcontroller *myView = [[MyViewcontroller alloc] initWithNibName:@"MyViewcontroller" bundle:nil];
        [myView.imageButton setTitle:@"ddd" forState:UIControlStateNormal];
        [scrollView addSubview:myView.view];
        [myView release], myView = nil;
    }
}

Ответ 1

Это происходит потому, что выходы не подключаются, пока загрузка не будет загружена, и представление не будет загружено до тех пор, пока оно не будет вызвано в первый раз (это ленивая загрузка). Вы можете исправить это очень легко, просто убедитесь, что вы всегда загружаете представление в первую очередь. Однако вам может потребоваться пересмотреть свой дизайн и сделать название кнопки зависимым от другого элемента, который не является частью иерархии представлений.

Например, если вы переупорядочиваете свои звонки, он будет работать:

MyViewcontroller *myView = [[MyViewcontroller alloc] initWithNibName:@"MyViewcontroller" bundle:nil];
[scrollView addSubview:myView.view]; // view is loaded
[myView.imageButton setTitle:@"ddd" forState:UIControlStateNormal]; // imageButton is now wired