我有一个具有NSInteger(或NSNumber)属性的viewController,我想要做的是将整数传递给子ViewController,做一些更改(可能会添加一些数字)。
但是当我在父控制器和子控制器中使用NSNumber作为属性并通过set属性传递它时:
<ctype.h>
这不能改变父级的值,因为NSNumber是只读的,并且在子级中它们分配了一个新的,而不更改父级的值。
所以:
如何将NSInteger或NSNumber传递给子ViewController并更改其中的值,当子节点弹出时,父控制器会得到更改?
答案 0 :(得分:3)
您正在以下行中定义和分配新的NSNumber:
self.num = [NSNumber numberWithInteger:[self.num integerValue] + 1];
您不能使用此方法,因为NSNumbers是不可变的。
因此,self.num将指向与父级num
不同的另一个位置。
为了避免这样的问题,你可以使用委托模式或简单地将父的viewController指针传递给子节点并更改其num
值。
例如:
家长的标题:
@property (nonatomic,strong) NSNumber *num;
Child's Header:
@property (nonatomic,weak) parentViewControllerClass * parentClass;
代码:
self.parentClass.num = [NSNumber numberWithInteger:[self.parentClass.num integerValue] + 1];
答案 1 :(得分:0)
也许在其他语言中你可以将指针传递给指针(我不确定你应该),但在Objective-C中你可以&#39;请求财产地址。
可以做的是:
setNumber:
setNumber:
功能)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"];
// ...
}