0

サブビューからメインのViewControllerのメソッドにアクセスしようとすると、アプリがクラッシュします。

助けてください。

メインのViewControllerにUIButtonがあり、メインのビューにもあるUILabelのテキストを変更します。メインのViewControllerから同じメソッドにアクセスすることにより、文字列を再度変更することになっているサブビューにUIButtonがあります。しかし、アプリがクラッシュします。

これが私のコードです:

メインViewController

ViewController.h

#import <UIKit/UIKit.h>
#import "SubViewController.h"

@interface ViewController : UIViewController

@property (nonatomic, strong) UILabel *label;
@property (nonatomic, retain) UIButton *mainClassButton;

- (void) setLabelTo:(NSString *)copy;

@end

ViewController.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize label;
@synthesize mainClassButton;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    self.label = [[UILabel alloc] initWithFrame:CGRectMake(30.0, 30.0, 200.0, 30.0)];
    self.label.text = @"Let's Go Mets!";
    [self.view addSubview:label];

    mainClassButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    mainClassButton.frame = CGRectMake(30.0, 70.0, 200.0, 30.0);
    [mainClassButton setTitle:@"Main Class Button" forState:UIControlStateNormal];
    [mainClassButton addTarget:self action:@selector(touchAction:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:mainClassButton];

    SubViewController *subViewController = [[SubViewController alloc] init];
    subViewController.view.backgroundColor = [UIColor clearColor];
    [self.view addSubview:subViewController.view];

    [self.view bringSubviewToFront:self.mainClassButton];
}

- (IBAction)touchAction:(UIButton *) sender
{
    [self setLabelTo:@"Here we go Yankess!"];
}

- (void) setLabelTo:(NSString *)copy
{
    self.label.text = copy;
}

サブViewController

SubViewController.h

#import <UIKit/UIKit.h>
#import "ViewController.h"

@interface SubViewController : UIViewController

@property (nonatomic, retain) UIButton *subClassButton;

@end

SubViewController.m

@implementation SubViewController

@synthesize subClassButton;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    subClassButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    subClassButton.frame = CGRectMake(30.0, 115.0, 200.0, 30.0);
    [subClassButton setTitle:@"Sub Class Button" forState:UIControlStateNormal];
    [subClassButton addTarget:self action:@selector(touchAction:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:subClassButton];

}

- (IBAction)touchAction:(UIButton *) sender
{
    ViewController *vc = [[ViewController alloc] init];

    [vc setLabelTo:@"If you ask me, I prefer the White Sox."];
}

私はまだXcodeとObjective-Cに少し慣れていないので、何か助けていただければ幸いです。

ありがとう

4

3 に答える 3

1

-setLabelToの既存のインスタンスを内部から呼び出す必要があります。ViewController現時点で-[SubViewController touchAction:]は、の新しいインスタンスを作成し、その新しいインスタンスViewControllerを呼び出し-setLabelTo:ています。

を呼び出す-setLabelToにはViewController、そのへの参照が必要ですViewController

UIViewControllerparentViewController理想的な状況下で、あなたSubViewControllerへの参照を提供するプロパティを提供しますViewController。ただし、この場合、そのような参照は提供されません。あなたはあなたSubViewControllerのビューをあなたのサブビューとして追加しますが、あなたはあなたの子ビューコントローラとしてあなたを追加ViewControllerしませ。(この質問承認された回答も参照してください。)この問題を修正するには、に次の行を追加します。SubViewControllerViewController-[ViewController viewDidLoad]

[self addChildViewController:subViewController];

SubViewController *subViewController = [[SubViewController alloc] init];

あなたに与える

SubViewController *subViewController = [[SubViewController alloc] init];
[self addChildViewController:subViewController];
subViewController.view.backgroundColor = [UIColor clearColor];
[self.view addSubview:subViewController.view];

この時点で、あなたSubViewControllerはの子ビューコントローラでViewControllerあり、あなたSubViewControllerのビューはあなたのビューのサブビューですViewController

この時点で、の実装を-[SubViewController touchAction:]に変更できます

- (IBAction)touchAction:(UIButton *) sender
{
    ViewController *vc = self.parentViewController;

    [vc setLabelTo:@"If you ask me, I prefer the White Sox."];
}

これは、新しいインスタンスを作成してクラッシュを引き起こすのではなく-setLabelTo:、元のインスタンスを呼び出します。ViewController

于 2013-01-07T23:09:39.153 に答える
0

subviewcontrollerの親ViewControllerを取得するself.parentViewController 必要があります。subViewControllerのtouchActionで行ったことは、新しいViewControllerを作成することです。

于 2013-01-07T23:08:24.430 に答える
0

これらの行を見てください:

ViewController *vc = [[ViewController alloc] init];
[vc setLabelTo:@"If you ask me, I prefer the White Sox."];

ViewControllerをインスタンス化していますが、viewDidLoadが呼び出されていません。そこで、メソッドを使用してタイトルを設定するUILabelをインスタンス化しますsetLabelTo

viewDidXXXXとviewWillXXXXは Storyboard、いくつかのUINavigationControllerで使用されると、自動的に呼び出されます。

于 2013-01-07T23:11:18.107 に答える