在另一个视图控制器中调用 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 中的操作的主要内容,如果未能解决你的问题,请参考以下文章

UIPageViewController 和 UIScrollView

在另一个视图控制器中添加视图控制器作为子视图

在另一个视图控制器中添加视图控制器作为子视图

如何在 iOS 中呈现一个半透明(半切)的视图控制器?

在另一个视图控制器中显示视图控制器时如何防止闪烁

在另一个视图控制器中传递 ImagePickerView 的图像