I have a simple setup using storyboard with one viewcontroller (MainViewController) speaking to another (JoinedViewController) via a delegate. Everything is good up until the prepareForSegue. There, I am declaring the roomData and a label’s text for the receiving viewcontroller, but neither is received.
MainViewController.m
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"JoinRoom"]) {
UINavigationController *navigationController = segue.destinationViewController;
JoinedViewController *joinedViewController = [[navigationController viewControllers]objectAtIndex:0];
joinedViewController.label.text = self.roomName;
joinedViewController.roomData = self.roomData;
joinedViewController.delegate = self;
}
}
MainViewController.h delcarations:
@interface MainViewController : UIViewController <JoinedViewControllerDelegate, UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UITextField *textField;
@property (nonatomic, copy) NSString *roomName;
@property (nonatomic, weak) S3ListObjectsResult *roomData;
JoinedViewController.h declarations:
@interface JoinedViewController : UITableViewController
@property (nonatomic, weak) id <JoinedViewControllerDelegate> delegate;
@property (nonatomic, weak) S3ListObjectsResult *roomData;
@property (weak, nonatomic) IBOutlet UILabel *label;
I think you have two different problems. roomData should be declared strong, not weak (in both classes). The problem with roomName, isn’t the string itself, but the fact that you’re trying to set it on the label before JoinedViewController’s viewDidLoad has even been called. You can’t access another controller’s UI elements until its view has been loaded. You should pass the string, roomData instead, and set it on the label in JoinedViewController’s viewDidAppear method.