如何在子视图中访问数组变量值

时间:2014-05-08 16:13:22

标签: ios objective-c

我正在尝试从子视图访问父视图中定义为属性的数组,我得到一个空数组。这就是我做的。请有人点亮一些光!

FirstTableViewController.h

@interface FirstTableViewController : UITableViewController
@property (nonatomic,retain) NSMutableArray *SomeItems; 
@end

在我的FirstTableViewController.m中。我有用于使用值初始化SomeItems的代码。这已经过验证

在FirstTableViewController视图上,有一个显示第二个SecondTableView

的按钮

在SecondTableViewController.m中我有

#import "FirstTableViewController.h"
#import "SecondTableViewController.h"

- (void)viewDidLoad
{
[super viewDidLoad];
FirstTableViewController * objParent;   
NSLog(@"count = %i",[objParent.SomeItems count]);  //this return 0
}

提前感谢!

EDITED

ToDoListTableViewController.h

@interface ToDoListTableViewController : UITableViewController
@property (nonatomic, strong) NSMutableArray *toDoItems;
- (IBAction)unwindToList:(UIStoryboardSegue *)segue : (id) sender;
@end

ToDoListTableViewController.m

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
//Attempt to pass toDoItems to new view controller.
//CompleteTableViewController.toDoItems = [self.toDoItems copy]; //this line caused compiler error saying toDoItems not found on object of CompleteTableViewController

CompleteTableViewController * objChild =  (CompleteTableViewController*)[segue destinationViewController];
if(objChild != nil)
objChild.toDoItems = [self.toDoItems copy];

//sorry for weird code, as I don't really understand how this method really works.
//but I have a feeling I am just some inches away from getting it to work the way i want
}

CompleteTableViewController.h

@interface CompleteTableViewController : UITableViewController
@property (nonatomic,copy) NSMutableArray *toDoItems;
@end

CompleteTableViewController.m

- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"#%i record(s) in Complete Table View", [toDoItems count]);
}

再次感谢!

4 个答案:

答案 0 :(得分:0)

您需要将父对象的引用传递给创建时的子对象,或者只是传递对该数组本身的引用。

答案 1 :(得分:0)

很明显,你错过了OOP的基本概念。

你声明了这个:

FirstTableViewController * objParent; 

但首先没有初始化,第二个它没有指向你的instanced viewController

其他事情,但此时成为次要的是:

如果您使用的是ARC,请声明property strong而不是retain; 方法和变量应尊重Camel方法,因此不是SomeItems,而是someItems;

因此,如果您要从另一个开启viewController并且想要访问array,那么您可以做的最好的事情就是传递array,所以在第二个也有这样的属性的viewController:

@property (nonatomic,copy) NSArray *someItems;

当你按下第一个viewController中的按钮时,先按下第二个viewController:

secondViewController.someItems = [self.someItems copy];

请注意,在第二个视图控制器中,数组不可变,因为您可能只想访问信息。但这取决于你。

有点难以解释你,因为我看到你真的是个新手。但是,我希望能帮到你。

答案 2 :(得分:0)

从Matteo的建议来看,这似乎解决了我的问题

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UINavigationController *navigationController = segue.destinationViewController;
    CompleteTableViewController *objChild = (CompleteTableViewController *)navigationController.topViewController;

        if(objChild != nil){
            objChild.toDoItems =  [self.toDoItems copy];
        }
}

感谢Matteo。

答案 3 :(得分:-1)

SecondTableViewController中,您已在FirstTableViewController中声明viewDidLoad,但这并不意味着它指向您之前创建的FirstTableViewController (你没有完成任务)。在调用viewDidLoad之前,您需要将FirstTableViewController传递给SecondTableViewController,将其分配给范围不是本地的变量,然后您才能访问FirstTableViewController 1}}和/或SomeItems viewDidLoad内的SomeItems

如果不了解您的设计或您想要完成的任务,最好将SecondTableViewController传递给FirstTableViewController作为初始化设计的一部分,如果这样做的话。你只需要SomeItems。如果您从控制器到控制器的状态将会改变您正在访问的状态,我强烈建议您花更多时间阅读模型 - 视图 - 控制器(MVC),委派和可能关键价值观察(KVO)。你错过了一些基本知识。

修改:同意命名,someItems应为{{1}}。