在另一个视图控制器中调用 uiviewcontroller 中的操作
Posted
技术标签:
【中文标题】在另一个视图控制器中调用 uiviewcontroller 中的操作【英文标题】:Calling an action in uiviewcontroller inside another viewcontroller 【发布时间】:2014-07-22 16:11:06 【问题描述】:我的应用程序结构简单:
有一个 ViewConroller1 是一个根视图控制器;
ViewController1 有一个滚动视图,其中包含另一个视图控制器 ViewController2 的 10 个实例。
ViewController2 中有一个 xib,该 xib 上有一个 UIButton。 UIButton 在 ViewController2 .m 文件中有一个动作——它应该在被点击时触发。
当我运行应用程序时,我触摸了按钮,它会异常关闭。 当我将 ViewController2 设置为根视图控制器时,一切都按预期运行。
如何在 ViewConroller1 作为根视图控制器的情况下使其正常运行?
一些代码:
ViewController1 (GSMainVC.m)
#import "GSMainVC.h"
#import "GSViewController.h"
@interface GSMainVC ()
@end
@implementation GSMainVC
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self)
// Custom initialization
return self;
- (void)viewDidLoad
[super viewDidLoad];
int n=10;
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.view.frame];
scrollView.contentSize = CGSizeMake(self.view.frame.size.width*n, self.view.frame.size.height);
for (int i = 0; i <n; i++)
GSViewController *gsVC = [[GSViewController alloc] init];
CGRect cellFrame = CGRectMake(gsVC.view.frame.size.width*i, 0, gsVC.view.frame.size.width, gsVC.view.frame.size.height);
gsVC.view.frame = cellFrame;
[scrollView addSubview:gsVC.view];
[self.view addSubview:scrollView];
@end
ViewController2.h (GSViewController.h)
#import <UIKit/UIKit.h>
@interface GSViewController : UIViewController
@property (nonatomic) NSInteger number;
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
@property (weak, nonatomic) IBOutlet UILabel *subtitleLabel;
@property (weak, nonatomic) IBOutlet UILabel *daysPlayedLabel;
@property (weak, nonatomic) IBOutlet UIButton *repeatButton;
- (IBAction)toggleRepeat:(id)sender;
@end
ViewConroller2 .m (GSViewController.m)
#import "GSViewController.h"
@implementation GSViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self)
// Custom initialization
return self;
- (IBAction)toggleRepeat:(id)sender
NSLog (@"hello");
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
@end
【问题讨论】:
你遇到了什么样的异常? 您是否将这 10 个实例添加为子视图控制器?如果不是,你应该是。一个更普遍的问题是,为什么你需要这 10 个视图控制器而不是使用 10 个视图? 见raywenderlich.com/10209/my-app-crashed-now-what-part-1 这个异常没什么特别的。一般来说,在子视图控制器中处理操作时会出现问题。我必须在这里忘记一些非常基本的东西 - 例如我错过了一些应该在那里的代表团......知道这可能是什么常见的新手错误吗? 请展示您的实现,特别是您如何添加这些子视图。一种可能性是,当您添加子控制器的视图时,您不会保留这些控制器,然后您的按钮会尝试消息重新分配对象。一般来说,这种视图控制器跳动通常是错误的方法:每个视图都不需要自己的控制器。 【参考方案1】:正如约翰所说:
一种可能性是,当您添加子控制器的视图时,您不会保留这些控制器,然后您的按钮会尝试消息重新分配对象。一般来说,这种视图控制器跳动通常是错误的方法:每个视图都不需要自己的控制器。
正如其他人提到的,这看起来像是发明自行车,尤其是当工具UICollectionView
可用时。这就是我现在要挖掘的方式。
【讨论】:
以上是关于在另一个视图控制器中调用 uiviewcontroller 中的操作的主要内容,如果未能解决你的问题,请参考以下文章