【问题标题】:How to pass NSObject from one view controller to another如何将 NSObject 从一个视图控制器传递到另一个
【发布时间】:2013-05-07 09:36:00
【问题描述】:

我正在使用带有 arc 的 iOS 5 SDK。我想将NSObject 从 VC1 视图控制器传递到 VC2 视图控制器,进行修改并放回 VC1 控制器。我不想从 VC1 和 VC2 控制器中指向相同的 nsobject。每当我传递 nsobject 时,它应该创建该 nsobject 的副本并进行修改。 (不要修改实际的 nsobject)。

我尝试了下面的代码,但它崩溃并给出错误

-[ImageObject mutableCopyWithZone:]:无法识别的选择器发送到实例 0x1364ec20

代码:

我有 NSObject:

@interface ImageObject : NSObject
@property (copy,nonatomic) NSString *path;
@property (nonatomic, readwrite) int id;
@end

在 VC1 视图控制器中:

我将我的 nsobject 传递给 VC2 视图控制器,如下所示:

VC2ViewController *vc2 = [[VC2ViewController alloc] initWithNibName:@"VC2ViewController" bundle:nil];
vc2.imageObj = [imgObj mutableCopy];
[self.navigationController pushViewController:vc2 animated:YES];

在 VC2 视图控制器中:

VC2ViewController.h 文件

#import "ImageObject.h"
@interface VC2ViewController : UIViewController
@property (retain,nonatomic) ImageObject *imageObj; 
@end

VC2ViewController.m 文件

//修改nsobject如下

-(void)modifyObject
{
UIViewController *previousViewController = [self.navigationController.viewControllers objectAtIndex:self.navigationController.viewControllers.count-2];
        if ([previousViewController isKindOfClass:[VC1ViewController class]])
        {
            VC1ViewController *parent = (VC1ViewController *) previousViewController;
            if(parent != nil)
            {
                _imageObj.id = 2;
                [parent reloadData:_imageObj];
            }
            parent = nil;
        }
[self.navigationController popViewControllerAnimated:YES];
}

有什么想法吗?如何解决这个问题?

【问题讨论】:

    标签: ios uiviewcontroller copy automatic-ref-counting nsobject


    【解决方案1】:

    您的ImageObject 类需要符合NSCopying 协议。 这个answer here 解释得更好,并向您展示了代码的样子。

    我也认为你需要使用[imgObj copy] 而不是[imgObj mutableCopy] 因为根据苹果docs

    NSMutableCopying 协议声明了一种提供对象可变副本的方法。 只有定义了“不可变与可变”区别的类应该采用这个协议。 没有定义这种区别的类应该改用 NSCopying。

    【讨论】:

    • 您好 Mariam,谢谢您的回答。我阅读了有关 NSCopying 协议的信息。还从这里(sarojsblog.blogspot.in/2011/07/…)查看了 copy 和 mutableCopy 之间的区别。据我了解,如果我使用复制,那么两个数组将指向同一个地址,但如果我使用 mutableCoopy 而不是复制,那么两个数组将具有不同的地址。那么,我应该使用哪种协议? NSCopying 或 NSMutableCopying
    • 您应该使用 NSCopying 除非您的 ImageObject 具有不可变和可变两种类型,我认为这里不是这种情况。这篇文章讨论了普通 NSArray 和 NSMutableArray 之间的区别,这是两种不同类型的对象类......很像普通字符串和可变字符串。
    • 从逻辑的角度来看,我明白为什么您认为使用 mutableCopy 更有意义(您可以更改对象的内容)但这里的重点是 NO Immutable Version 你的班级......因此,没有“不可变与可变的区别”因此......”改为采用 NSCopying。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 2017-05-28
    相关资源
    最近更新 更多