[英]iOS change Integer/NSNumber of parent ViewController
我有一个具有NSInteger(或NSNumber)属性的viewController,我想要做的是将整数传递给子ViewController,做一些更改(可能添加一些数字)。
但是当我在父控制器和子控制器中使用NSNumber作为属性并通过set属性传递它时:
//parent and child property.
@property (nonatomic,strong) NSNumber *num;
//pass to the child
child.num = self.num;
//do some change in child
self.num = [NSNumber numberWithInteger:[self.num integerValue] + 1];
这不能更改父级的值,因为NSNumber是只读的,并且在子级中它们分配了一个新的,而不更改父级的值。
所以:
我如何将NSInteger或NSNumber传递给子ViewController并更改其中的值,当子弹出时,父控制器得到更改?
您正在以下行中定义和分配新的NSNumber:
self.num = [NSNumber numberWithInteger:[self.num integerValue] + 1];
您不能使用此方法,因为NSNumbers是不可变的。 所以self.num将指向与父的num
不同的另一个位置。 为了避免这样的问题,你可以使用委托模式或简单地将父的viewController指针传递给子节点并更改其num
值。
例如:
家长的标题:
@property (nonatomic,strong) NSNumber *num;
孩子的标题:
@property (nonatomic,weak) parentViewControllerClass * parentClass;
码:
self.parentClass.num = [NSNumber numberWithInteger:[self.parentClass.num integerValue] + 1];
也许在其他语言中你可以将指针传递给指针(我不确定你是否应该 ),但在Objective-C中你不能请求属性的地址。
你可以做的是:
setNumber:
方法的协议setNumber:
setNumber:
function) setNumber:
来自子控制器 创建父控制器和子控制器之间共享的可变对象。 例如:
@interface Counter : NSObject @property (nonatomic) NSInteger value; @end
您可以从子控制器发布有关号码更改的通知,并在父级中观察它:
// post notification in child NSNumber *num = [NSNumber numberWithInteger:1]; [[NSNotificationCenter defaultCenter] postNotificationName:@"numberChangedNotification" object:self userInfo:@{@"number": num}]; // observe notifications in parent // first register observer in viewDidLoad [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeNumber:) name:@"numberChangedNotification" object:child]; // and implement updateNumber - changeNumber: (NSNotification *)notification { NSNumber *num = notification.userInfo[@"number"]; // ... }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.