[英]Property don't update
I beginner in iOs programming. 我是iOs编程的初学者。 I have some problem. 我有问题 I have MasterViewController, code below 我有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";
}
and I send property "str" to DetailViewController. 然后将属性“ str”发送到DetailViewController。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"showDetail"]) {
NSString *object = self.str;
[[segue destinationViewController] setDetailItem:object];
}
}
after, I change str 之后,我更改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";
}
after, I come back to MasterViewController but str don't change. 之后,我回到MasterViewController,但是str不会改变。 Why? 为什么?
The problem is that you're just changing which object the detailItem
property refers to in DetailViewController
, rather than changing the value of the object itself. 问题在于您只是更改了detailItem
属性在DetailViewController
引用的对象,而不是更改对象本身的值。 When you set self.detailItem
in the viewDidLoad
method, the str
property MasterViewController
will continue to point to the original string: 当您在viewDidLoad
方法中设置self.detailItem
时, str
属性MasterViewController
将继续指向原始字符串:
Before: 之前:
MasterViewController.str -> 1234 <- DetailViewController.detailItem
Then you do self.detailItem = 1233
. 然后,您执行self.detailItem = 1233
。 It doesn't change the value of the strings themselves, but just makes detailItem point to a new string. 它不会更改字符串本身的值,而只是使detailItem指向新字符串。 Looking at the graph below, it moves the arrow pointing from DetailViewController rather than changing the content of "1234" itself: 看下面的图,它移动了从DetailViewController指向的箭头,而不是更改“ 1234”本身的内容:
MasterViewController.str -> 1234
1233 <- DetailViewController.detailItem
What you want to do here is use the delegate pattern to properly notify the MasterViewController of changes in the detail controller and give it access to the new value. 您要在此处执行的任务是使用委托模式将明细控制器中的更改正确地通知给MasterViewController并为其提供对新值的访问权限。
DetailViewController.h: 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: DetailViewController.m:
- (void)setDetailItem:(id)newDetailItem
{
if (_detailItem != newDetailItem) {
_detailItem = newDetailItem;
// notify the delegate whenever the detailItem changes
[self.delegate detailViewControllerChangedDetailItem:self];
}
}
MasterViewController.m: 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.