我正在使用MMDrawerController并希望将数据从一个视图控制器传递到另一个视图控制器(HomeViewController到DetailViewController)
HomeViewController视图控制器
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视图控制器 的 DetailsViewController.h
@property (nonatomic,weak) NSString* catName;
@property (nonatomic,weak) NSString* catUrl;
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.title = [_catName uppercaseString];
}
但有时候_catName的值为nil。
有什么不对,如果那么请提示。
如果定义属性的问题很弱,那么我为视图控制器属性选择了什么类型的属性。
答案 0 :(得分:0)
当您从appdelegate传递数据时,请将您的属性作为强引用。这也会对你有所帮助。
<label> Country </label>
<div class="col-md-8">
<div class="input-icon right">
<select id="country" multiple name="country[]" onchange="
getValue('opens-clicks-region', 'student_tracking', 'region', 'country', this.value, this.id)" disabled="disabled">
<option value=""></option>
</select>
</div>
</div>
答案 1 :(得分:0)
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”。
答案 2 :(得分:0)
当然问题在于NSString属性较弱。你应该对NSString catName和NSString catUrl有很强的引用,因为它们必须在内存中。 在你的情况下,catName和catUrl在方法(已经设置)之后就消失了。
但是你应该因为NSString而设置一个copy属性参数(这里有更多关于这个https://stackoverflow.com/a/31217735/5151981)
所以你的代码应该是这样的:
@property (nonatomic, copy) NSString *catName;
@property (nonatomic, copy) NSString *catURLString;
答案 3 :(得分:0)
请使用非原子并保留
@property (nonatomic, retain) NSString* catUrl;
@property (nonatomic, retain) NSString* catName;