我正在尝试从子视图访问父视图中定义为属性的数组,我得到一个空数组。这就是我做的。请有人点亮一些光!
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]);
}
再次感谢!
答案 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}}。