【问题标题】:Passing NSMutableArray from one View Controller to a function in another将 NSMutableArray 从一个视图控制器传递到另一个视图控制器中的函数
【发布时间】:2012-06-29 12:07:30
【问题描述】:

我已经阅读了关于 SO 在两个视图控制器之间传递数据的几个问题,并看到了建议的不同方式。我的问题如下:

我有一个视图控制器(我们称之为“A”),它在工具栏中有一个搜索栏。没有其他的。然后我有另一个视图控制器(“B”),当用户在搜索栏中搜索时按下键盘上的搜索按钮时,它负责显示弹出视图。 这一切都有效。用户输入文本,按下搜索按钮,弹出框就会显示出来。太好了。

现在我还没有在 popover tableview 中显示任何搜索结果,我正在尝试将 NSMutableArray 作为参数传递给 B 中的函数:

在 B.h:

@property (nonatomic, retain) NSMutableArray *searchResults;

在 B.m:

    @synthesize searchResults;

     -(void)setSearchResults:(NSMutableArray *)resultArray{
         [self.searchResults removeAllObjects];
         [self.searchResults addObjectsFromArray:resultArray];
     }

在 A.h 中:

#import "B.h"
@property(nonatomic, retain) B *viewControllerObjectB;

上午:

@synthesize viewControllerObjectB;

 //The searchResultsArray is passed on from another function
-(void)communicateWithB:(NSMutableArray *)searchResultsArray{

    //I initialize the viewControllerObjectB in here

    NSMutableArray *temp = [[NSMutableArray alloc] initWithArray:searchResultsArray];
    [viewControllerObjectB setSearchResults:temp];
}

现在这一切正常,除了我没有将 temp 的内容传递到 B.m 中的函数中。我是空的(零)。这是我的问题。

我对 iOS 还很陌生,因此我们将不胜感激。

编辑:忘了提到我正在使用 ARC。

【问题讨论】:

  • 我建议你在初始化 B 视图控制器的对象时传递结果数组。或者您必须通过调用 [viewControllerObjectB.tableview reloadData] 在加载新结果后重新加载 tableview 数据
  • 为了清楚 what 是 nil,你从 communicateWithB 方法中的 NSLog(@"Temp: %@", temp); 得到什么?另外,NSLog(@"Result: %@", resultArray);setSearchResults? (如果“Temp”说它为零,那searchResultsArray呢?)
  • 在 searchResultsArray 我得到一个包含 5 个对象的数组。在communicateWithB 我得到一个空数组。我在addobjectsFromArray 行下方设置了一个刹车点并打印出内容。

标签: objective-c ios nsmutablearray nsarray


【解决方案1】:

你没有初始化你的数组(这就是它为零的原因)。所以在 alloc 方法中你应该:

- (id)init {
    self = [super init];

     if (self) {
          self.searchResults = [NSMutableArray arrayWithCapacity:10];
     }
}

我还在您的代码中发现了 2 个问题:

@synthesize searchResults;

     -(void)setSearchResults:(NSMutableArray *)resultArray{
         //PROPERTY LOGIC IS RETAIN, SO YOU NEED TO RELEASE/RETAIN WHEN YOU OVERRIDE A SETTER
         if (searchResults != resultArray) {
              [searchResults release];
              searchResults = [resultArray retain];
         }
     }


-(void)communicateWithB:(NSMutableArray *)searchResultsArray{

    //I initialize the viewControllerObjectB in here
    //MEM. LEAK ON TEMP
    NSMutableArray *temp = [[[NSMutableArray alloc] initWithArray:searchResultsArray] autorelease];
    [viewControllerObjectB setSearchResults:temp];
}

【讨论】:

  • 对不起,应该补充说我正在使用 ARC,所以我不需要指定 autorelease 也不需要手动指定 releasesearchResultsviewDidLoad 中初始化,所以我认为这不是问题所在。不过谢谢。
  • 你有一个评论 //我在这里初始化了viewControllerObjectB,所以是不是没有调用viewDidLoad,所以你的self.searchResults此时为nil?在设置器中放置断点时,您应该查看 searchResults 是否初始化了任何数组
  • 我是个笨蛋。我错误地分配了数组。应该做searchResults = resultArray。虽然这不是你直接说的,但你的回答让我明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
相关资源
最近更新 更多