【问题标题】:How to copy NSMutableArray value into another NSMutableArray in iPhone?如何将 NSMutableArray 值复制到 iPhone 中的另一个 NSMutableArray?
【发布时间】:2012-08-03 06:31:59
【问题描述】:

在这里,我的AppDelegate 页面中有一个NSMutableArray,当用户在数据库中添加值(用户名)时,数组将被更新。现在我希望数组值(用户名)显示在下一个视图中,以便在选取器视图中列出。我知道还有更多相关的问题,但我找不到解决方案。任何帮助表示赞赏。

这是我的代码:

我在AppDelegate 页面中声明的数组,名为jobarray,现在我需要将jobarray 中的项目复制到下一个视图中,我已经声明了pickerarray

pickerarray = [[NSMutableArray alloc] initWithArray:appDelegate.jobarray copyItems:YES];

但它返回错误信息,

['NSInvalidArgumentException', reason: '-[Coffee copyWithZone:]: unrecognized selector sent to instance 0x822d410']     where 'Coffee' is my sqlite3 object file.

【问题讨论】:

  • 感谢您的链接,我已对其进行了审核,并将 [ Copyitems : YES] 更改为“NO”。我收到了这个错误,-[Coffee isEqualToString:]: unrecognized selector sent to instance 0x8524fa0.请就此提出建议。

标签: iphone sqlite nsmutablearray


【解决方案1】:

您的 SQLite 对象不符合 NSCopying 协议 - 您还没有实现

- (id)copyWithZone:(NSZone *)zone;

方法。您可以实现此方法以使您的对象可复制,但如果您只需要复制显示,您最好只复制数组本身

NSMutableArray *newArray = [originalArray mutableCopy];

这只会保留第一个数组的对象,不需要搞乱复制协议的实现。

【讨论】:

  • 感谢您的回答(H2CO3),您能否详细说明如何使“jobarray”(在我的帖子中提到)本身复制。
  • @jireh 正如我所说,你必须实现 copyWithZone: 方法。
  • 你能给我一些在'copyWithZone:方法'中制作数组的代码吗?
  • @jireh 选择我的第二种方法 :) NSMutableArray *newArray = [jobarray mutableCopy];
  • 嗨@H2CO3 我会试试的,让你知道。谢谢你的回复。
【解决方案2】:
[arr1 initWithObjects:@"1",@"2", nil];

没有意义,你可能想要的是使用 NSMutableArray:

NSArray *arr1 = [NSArray arrayWithObjects:@"1",@"2", nil];
NSMutableArray *arr2 = [arr1 mutableCopy];

NSLog(@"arr1: %p, %@", arr1, arr1);
NSLog(@"arr2: %p, %@", arr2, arr2);

NSLog 输出:

arr1: 0x7924c50, (
                 1,
                 2
                 )
arr2: 0x7924f00, (
                 1,
                 2
                 )

【讨论】:

    【解决方案3】:

    要从数组中填充 UIPickerView,您需要首先为 UIPickerView 数据源创建一个连接,然后将其委托回 ViewController。您可以通过 CTRL 以正常方式在 Interface Builder 中拖动来执行此操作 - 从您的 UIPickerView 控件。

    您还需要确保将委托协议包含到您的接口文件中。所以像这样;

    @ViewController : UIViewController<UIPickerViewDataSource, UIPickerViewDelegate> {  
    

    }

    然后您需要在您的实现文件中为 UIPickerView 的填充创建委托方法。

    -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
     {
        //One column
        return 1;
     }
    
    -(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
     {
       //set number of rows
         return myArrayObject.count;
     }
    
    -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
     {
         //set item per row
         return [myArrayObject objectAtIndex:row];
     }
    

    这假定 myArrayObject 已在其他地方正确声明和填充。 IE。在 viewDidLoad - 如果内容是静态的。

    【讨论】:

    • 是的,我已经在 xib 和头文件中声明了数据源和委托,但它不起作用。
    • 我很抱歉,因为我认为我可能错误地解释了您的问题。我以为您在问如何从数组中填充 UIPickerView,但我认为实际上您是在问如何将数组的内容复制到另一个?
    • 为什么需要复制到新数组?为什么不能只使用 jobArray 作为pickerView 的数据源?
    • 对不起,如果这是一个愚蠢的问题,但在您的项目中使用 ARC(自动内存管理)?
    • 如果我在 numberofRowsInPickerView 中使用 jobarray(appDelegate.jobarray) 填充选择器视图,它会在数组中返回“0 个对象”,但数组中有一个值,并且它没有显示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多