[英]Property don't update
我是iOs编程的初学者。 我有问题 我有MasterViewController,下面的代码
#import "MasterViewController.h"
#import "DetailViewController.h"
@interface MasterViewController () {
}
@property (strong, nonatomic) NSString *str;
@end
@implementation MasterViewController
- (void)awakeFromNib
{
[super awakeFromNib];
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.str = @"1234";
}
然后将属性“ str”发送到DetailViewController。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"showDetail"]) {
NSString *object = self.str;
[[segue destinationViewController] setDetailItem:object];
}
}
之后,我更改str
#import "DetailViewController.h"
@interface DetailViewController ()
@end
@implementation DetailViewController
- (void)setDetailItem:(id)newDetailItem
{
if (_detailItem != newDetailItem) {
_detailItem = newDetailItem;
}
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.detailItem = @"1233";
}
之后,我回到MasterViewController,但是str不会改变。 为什么?
问题在于您只是更改了detailItem
属性在DetailViewController
引用的对象,而不是更改对象本身的值。 当您在viewDidLoad
方法中设置self.detailItem
时, str
属性MasterViewController
将继续指向原始字符串:
之前:
MasterViewController.str -> 1234 <- DetailViewController.detailItem
然后,您执行self.detailItem = 1233
。 它不会更改字符串本身的值,而只是使detailItem指向新字符串。 看下面的图,它移动了从DetailViewController指向的箭头,而不是更改“ 1234”本身的内容:
MasterViewController.str -> 1234
1233 <- DetailViewController.detailItem
您要在此处执行的任务是使用委托模式将明细控制器中的更改正确地通知给MasterViewController并为其提供对新值的访问权限。
DetailViewController.h:
// declare the delegate protocol
@class DetailViewController;
@protocol DetailViewControllerDelegate <NSObject>
-(void)detailViewControllerChangedDetailItem:(DetailViewController *)detailController;
@end
@interface DetailViewController
// add a property for the delegate
@property (nonatomic, copy) NSString *detailItem;
@property (nonatomic, weak) id <DetailViewControllerDelegate> delegate;
@end
DetailViewController.m:
- (void)setDetailItem:(id)newDetailItem
{
if (_detailItem != newDetailItem) {
_detailItem = newDetailItem;
// notify the delegate whenever the detailItem changes
[self.delegate detailViewControllerChangedDetailItem:self];
}
}
MasterViewController.m:
// mark this as implementing the delegate protocol
@interface MasterViewController () <DetailViewControllerDelegate> {
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"showDetail"]) {
NSString *object = self.str;
// wire up the delegate connection
[[segue destinationViewController] setDelegate:self];
// now whenever detailItem changes in the DetailViewController,
// it will notify its delegate (the master VC)
[[segue destinationViewController] setDetailItem:object];
}
}
// implement the delegate method
-(void)detailViewControllerChangedDetailItem:(DetailViewController *)detailController
{
// now you can get a copy of the new detailItem value
// and do whatever you want with it.
self.str = detailController.detailItem;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.