我有一个方法,它将视图控制器的视图作为子视图加载到scrollview。我试图添加为子视图的视图控制器视图中包含一个tableview。
-(void)addSubViewToScrollView{
CGFloat x = 0;
UIScrollView *scrollview = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0,
self.view.frame.size.width, self.view.frame.size.height)];
NSInteger viewcount= 8;
for(int i = 0; i< viewcount; i++) {
self.opt = [[EliteQuestionScreen alloc]
initWithNibName:@"EliteQuestionScreen"
bundle:[NSBundle mainBundle]];
if (i == 0) {
x = self.opt.view.frame.origin.x;
} else {
x = self.opt.view..frame.size.width + x;
}
UIView *viewMine = self.opt.view;
viewMine.frame = CGRectMake(x, 0, self.opt.view.frame.size.width,
self.opt.view.frame.size.height);
[scrollview setPagingEnabled:YES];
[scrollview addSubview:viewMine];
}
scrollview.contentSize = CGSizeMake(self.view.frame.size.width *viewcount,
self.view.frame.size.height);
[self.view addSubview:scrollview];
}
我已经像这样重新审视EliteQuestionScreen
的对象引用
@property(strong,nonatomic)EliteQuestionScreen *opt;
但是当此代码导致我的应用程序崩溃并且出现错误时
[EliteQuestionScreen tableView:numberOfRowsInSection:]: message sent to deallocated instance 0x716d6a0;
我无法理解这种行为?
但是当我刚刚关闭循环并将viewcontroller的视图作为子视图添加到scrollview时它运行良好
-(void)addSubViewToScrollView{
CGFloat x = 0;
UIScrollView *scrollview = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0,
self.view.frame.size.width, self.view.frame.size.height)];
NSInteger viewcount= 8;
self.opt = [[EliteQuestionScreen alloc]
initWithNibName:@"EliteQuestionScreen"
bundle:[NSBundle mainBundle]];
x = self.opt.view.frame.origin.x;
UIView *viewMine = self.opt.view;
viewMine.frame = CGRectMake(x, 0, self.opt.view.frame.size.width,
self.opt.view.frame.size.height);
[scrollview setPagingEnabled:YES];
[scrollview addSubview:viewMine];
scrollview.contentSize = CGSizeMake(self.view.frame.size.width *viewcount,
self.view.frame.size.height);
[self.view addSubview:scrollview];
}
为什么会发生这种情况我无法理解?
答案 0 :(得分:0)
问题是控制器对象是本地的,并且如果在.h文件中声明控制器对象,则会被取消分配
答案 1 :(得分:0)
试试这个,
for(int i = 0; i< viewcount; i++) {
EliteQuestionScreen *optScreen = [[EliteQuestionScreen alloc] initWithNibName:@"EliteQuestionScreen" bundle:[NSBundle mainBundle]];
if (i == 0) {
x = optScreen.view.frame.origin.x;
} else {
x = optScreen.view..frame.size.width + x;
}
//create and set a property in EliteQuestionScreen to identify different EliteQuestionScreen's (if needed)
UIView *viewMine = optScreen.view;
viewMine.frame = CGRectMake(x, 0, optScreen.view.frame.size.width,
optScreen.view.frame.size.height);
[scrollview setPagingEnabled:YES];
[scrollview addSubview:viewMine];
}
答案 2 :(得分:0)
按以下步骤更新-(void)addSubViewToScrollView
方法
-(void)addSubViewToScrollView {
NSInteger viewcount= 8;
// Code for adding subview inside scrollview
self.opt = [[EliteQuestionScreen alloc] initWithNibName:@"EliteQuestionScreen" bundle:[NSBundle mainBundle]];
[self addChildViewController: self.opt];
[scrollview addSubview:self.opt.view];
[self.opt didMoveToParentViewController: self];
scrollview.contentSize = CGSizeMake(self.view.frame.size.width *viewcount,
self.view.frame.size.height);
[self.view addSubview:scrollview];
}