iOS 更改 Integer/NSNumber 的 parent ViewController
iOS change Integer/NSNumber of parent ViewController
我有一个 viewController 和一个 属性 的 NSInteger(或 NSNumber),我想做的是将整数传递给 child ViewController,做一些变化(可能增加一些数字)。
但是当我在 parent 和 child 控制器中将 NSNumber 用作 属性 并通过设置 属性:
传递它时
//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];
这不能更改 parent 的值,因为 NSNumber 是只读的,并且在 child 中他们分配了一个新的,而不更改 parent 的值。
所以:
我如何将 NSInteger 或 NSNumber 传递给 child ViewController 并更改其中的值,当 child 弹出时,parent 控制器找零钱?
您正在以下行中定义和分配新的 NSNumber:
self.num = [NSNumber numberWithInteger:[self.num integerValue] + 1];
您不能使用此方法,因为 NSNumber 是不可变的。
所以 self.num 将指向不同于 parent 的 num
的另一个位置。
为避免此类问题,您可以使用委托模式或简单地将 parent 的 viewController 指针传递给 child 并更改其 num
值。
例如:
Parent的Header:
@property (nonatomic,strong) NSNumber *num;
Child的Header:
@property (nonatomic,weak) parentViewControllerClass * parentClass;
代码:
self.parentClass.num = [NSNumber numberWithInteger:[self.parentClass.num integerValue] + 1];
也许在其他语言中你可以传递指针到指针(我不确定你是否应该),但是在Objective-C 您不能请求 属性.
的地址
你可以做的是:
- 使用提到的委托模式——这意味着什么:
- 创建指定方法的协议,如
setNumber:
- 在你的父控制器中实现这个协议(只实现
setNumber:
函数)
- 将父控制器设置为子控制器的 属性,但作为此协议的实例,而不是它的实例 class - 以保持封装。
- 从子控制器调用
setNumber:
创建在父子控制器之间共享的可变对象。例如:
@interface Counter : NSObject
@property (nonatomic) NSInteger value;
@end
您可以 post 来自子控制器的关于号码变化的通知并在父控制器中观察它:
// 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"];
// ...
}
我有一个 viewController 和一个 属性 的 NSInteger(或 NSNumber),我想做的是将整数传递给 child ViewController,做一些变化(可能增加一些数字)。
但是当我在 parent 和 child 控制器中将 NSNumber 用作 属性 并通过设置 属性:
传递它时//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];
这不能更改 parent 的值,因为 NSNumber 是只读的,并且在 child 中他们分配了一个新的,而不更改 parent 的值。
所以:
我如何将 NSInteger 或 NSNumber 传递给 child ViewController 并更改其中的值,当 child 弹出时,parent 控制器找零钱?
您正在以下行中定义和分配新的 NSNumber:
self.num = [NSNumber numberWithInteger:[self.num integerValue] + 1];
您不能使用此方法,因为 NSNumber 是不可变的。
所以 self.num 将指向不同于 parent 的 num
的另一个位置。
为避免此类问题,您可以使用委托模式或简单地将 parent 的 viewController 指针传递给 child 并更改其 num
值。
例如:
Parent的Header:
@property (nonatomic,strong) NSNumber *num;
Child的Header:
@property (nonatomic,weak) parentViewControllerClass * parentClass;
代码:
self.parentClass.num = [NSNumber numberWithInteger:[self.parentClass.num integerValue] + 1];
也许在其他语言中你可以传递指针到指针(我不确定你是否应该),但是在Objective-C 您不能请求 属性.
的地址你可以做的是:
- 使用提到的委托模式——这意味着什么:
- 创建指定方法的协议,如
setNumber:
- 在你的父控制器中实现这个协议(只实现
setNumber:
函数) - 将父控制器设置为子控制器的 属性,但作为此协议的实例,而不是它的实例 class - 以保持封装。
- 从子控制器调用
setNumber:
- 创建指定方法的协议,如
创建在父子控制器之间共享的可变对象。例如:
@interface Counter : NSObject @property (nonatomic) NSInteger value; @end
您可以 post 来自子控制器的关于号码变化的通知并在父控制器中观察它:
// 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"]; // ... }