0

UIButton を作成できます。
ただし、 callback: target: object は現在のオブジェクト内では機能しません。??
「self.viewController」オブジェクトしか実行できず、現在のオブジェクトに対して「self」を実行することはできません。

どうも


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

@class ViewController;

@interface CGuiSetup : NSObject
{
    @public
    ViewController *viewController;
}
- (void) Setup;
- (void) ButtonRespond:(UIButton*) btn;
@end

#import "CGuiSetup.h"

@implementation CGuiSetup

- (void) ButtonRespond:(UIButton*) btn
{
    NSLog(@"ButtonRespond");
}


- (void) Setup
{

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [btn setFrame:CGRectMake(10,10,100,100)];

    // But I want to call the following in the CGuiSetup object (self) instead... but it crashes out if I leave it as just "self"
    [btn addTarget:self.viewController action:@selector(ButtonRespond:)
        forControlEvents:UIControlEventTouchUpInside]; //works: for "self.viewController" if I put ButtonRespond in the ViewController

    [btn addTarget:self action:@selector(ButtonRespond:)
        forControlEvents:UIControlEventTouchUpInside]; //fails: for "self"

    [self.viewController.view addSubview:btn];
}
@end

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

@class CGuiSetup;

@interface ViewController : UIViewController
{
    CGuiSetup *guiSetup; //<---- had to take this out of the "viewDidLoad" method
}
@end

- (void)viewDidLoad
{
    [super viewDidLoad];

    guiSetup = [CGuiSetup alloc];
    guiSetup->viewController = self;


    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [btn setFrame:CGRectMake(10,10,100,100)];
    [btn addTarget:guiSetup action:@selector(ButtonRespond:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];

}
4

2 に答える 2

2

ARC を使用している場合、CGuiSetup への保持参照を持つオブジェクトはありますか? CGuiSetup がインスタンス化され、viewController を作成 (または別のオブジェクトから受信) し、それにボタンを追加してから、View Controller を別のオブジェクトに渡します (おそらく、navController にプッシュするか、それを root コントローラーに設定することによって)。アプリ)?いずれにせよ、CGuiSetup は解放されており、ボタンは既に破棄されているオブジェクトにメッセージを送信しようとしています。CGuiSetup はどのように/どこで作成されますか? それへの参照を保持しているオブジェクトはどれですか? それがおそらくあなたの問題です。

保持/解放とは何か、および/または ARC とは何かを理解していない場合は、Apple のメモリ管理ガイドを読む必要があります: https://developer.apple.com/library/mac/#documentation/Cocoa /概念/MemoryMgmt/Articles/MemoryMgmt.html

于 2012-05-07T00:09:27.290 に答える
1

これはおそらく、_viewController の保持カウントが 0 より大きい (したがって、オブジェクトは破棄されていない) にもかかわらず、オブジェクトが破棄されたためです。あなたが保持している残高/解放カウント。

于 2012-05-06T23:09:00.220 に答える