我正在使用MMDrawerController,并希望将数据从一个视图控制器传递到另一个视图控制器(HomeViewController to DetailViewController)
首页视图控制器视图控制器
Category *categoryItem = [category objectAtIndex:cellIndex];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
DetailsViewController * centerVC=(DetailsViewController*)[storyboard instantiateViewControllerWithIdentifier:@"DetailsViewController"];
centerVC.catName= categoryItem.name ;
centerVC.catUrl=categoryItem.url;
UINavigationController * centerNav=[[UINavigationController alloc]initWithRootViewController:centerVC];
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.drawerController.centerViewController=centerNav;
在ViewDidLoad中,我们希望访问属性作为详细信息视图控制器视图控制器DetailsViewController.h
@property (nonatomic,weak) NSString* catName;
@property (nonatomic,weak) NSString* catUrl;
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.title = [_catName uppercaseString];
}
但有些时候_catName的价值为零。
有什么问题吗,如果那么请建议。
如果定义属性弱的问题,那么我为视图控制器属性选择哪种类型的属性。
weak
说"只要别人强烈指出它,就保持这个"。因此,您的属性 catName 和 catUrl 将仅持续到 categoryItem 在内存中。
相反,您可以使用 copy
.
@property (nonatomic, copy) NSString* catName;
@property (nonatomic, copy) NSString* catUrl;
副本保证您拥有的字符串不会更改。假设您想避免传递可变字符串然后在您不知情的情况下更改它。
例如
NSMutableString *someRandomString = [NSMutableString stringWithString:@"stackoverflow"];
Entrepreneur * entrepreneur = [[Entrepreneur alloc] init];
entrepreneur.name = someRandomString;
[someRandomString setString:@"Steve Jobs"];
现在,Entrepreneur 类的 name 属性的值将取决于该属性是声明为 strong
还是copy
;如果属性声明为 strong
,则为 @"Steve Jobs",如果属性声明为 copy
,则为 @"stackoverflow"。
当您从 appdelegate 传递数据时,将您的属性作为强有力的参考。 这也将对您有所帮助。
@property (nonatomic,strong) NSString* catUrl;
@property (nonatomic,strong) NSString* catName;
Objective-C 中的强弱差异
当然,问题出在NSString属性较弱。您应该对 NSString catName 和 NSString catURL 有很强的引用,因为它们必须在内存中。在你的情况下,catName 和 catUrl 在方法(它们已经设置的地方)完成后消失了。
但是你应该设置一个复制属性参数,因为 NSString (更多关于这个的信息在这里 https://stackoverflow.com/a/31217735/5151981)
所以你的代码应该看起来像这样:
@property (nonatomic, copy) NSString *catName;
@property (nonatomic, copy) NSString *catURLString;
请使用非原子并保留
@property (nonatomic, retain) NSString* catUrl;
@property (nonatomic, retain) NSString* catName;