0

これが状況です。「MyViewController」というタイトルのビューコントローラがあります。このViewController内には、サブクラス化されたボタンを使用するテキスト編集機能があります。UIButtonサブクラスの名前は「ColorSwatch」です。

「ColorSwatch.h」サブクラスにデリゲート/プロトコルメソッドを次のように設定しました。

//  ColorSwatch.h

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <QuartzCore/QuartzCore.h>

@protocol ColorSwatchDelegate <NSObject>
- (void)fontColor:(UIColor *)color;
@end

@interface ColorSwatch : UIButton {
id <ColorSwatchDelegate> colorSwatchDelegate;
    CAGradientLayer *gradient;
    UIView *currentView;
    UIColor *fontColor;
}

@property (nonatomic, retain) id <ColorSwatchDelegate> colorSwatchDelegate;
@property (nonatomic, retain) CAGradientLayer *gradient; 
@property (nonatomic, retain) UIView *currentView;
@property (nonatomic, retain) UIColor *fontColor;

@end

今私の「ColorSwatch.m」に私は持っています:

//  ColorSwatch.m

#import "ColorSwatch.h"
#import <QuartzCore/QuartzCore.h>
#import "MyViewController.h"

@implementation ColorSwatch

@synthesize gradient; 
@synthesize currentView;
@synthesize colorSwatchDelegate;
@synthesize fontColor;

-(void)setupView{
    "Makes the subclassed buttons pretty"
}

-(id)initWithFrame:(CGRect)frame{
    if((self = [super initWithFrame:frame])){

    }

    return self;
}

-(id)initWithCoder:(NSCoder *)aDecoder{
    if((self = [super initWithCoder:aDecoder])){
        [self setupView];
        MyViewController *mvc = [[MyViewController alloc] initWithNibName:
                                           @"MyViewController" bundle:nil];
        self.colorSwatchDelegate = mvc;
    }

    return self;
}


-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    [self magnify:view];
    fontColor = view.backgroundColor;
    [self.colorSwatchDelegate fontColor:fontColor];
}

- (void)magnify:(UIView *)view
{

}

- (void)dealloc
{
    [currentView release];
    [gradient release];
    [fontColor release];

    [super dealloc];
}

@end

「MyViewController.h」には次のものがあります。

//  MyViewController.h

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
#import "ColorSwatch.h"


@interface MyViewController : UIViewController <ColorSwatchDelegate> {    

UITextField *photoLabelTextField;

}

@property (nonatomic, retain) IBOutlet UITextField *photoLabelTextField;

@end

「MyViewController.m」には次のものがあります。

- (void)fontColor:(UIColor *)color
{
    NSLog(@"Selected Font Color");
    [self.photoLabelTextField setTextColor:color];
}

これで、デリゲートメソッドは一種の機能を果たします。つまり、カラーボタンをタップすると

NSLog(@"Selected Font Color");

メッセージが発生します。しかし、問題は私が変更できないことです

[self.photoLabelTextField setTextColor:color];

財産。プロパティを変更するさまざまな方法を試しましたが、NSLogを送信するだけで、「MyViewController」クラスのプロパティを変更しようとしても何も起こりません。

誰かが私を助けてくれたら、私はそれをいただければ幸いです。

ありがとうございました

4

2 に答える 2

2

問題は、ColorSwatchがそのinitWithCoder:メソッドで誤って割り当てたMyViewControllerのぶら下がっているインスタンスにデリゲートメッセージを送信していることです。

UIControlsは、ViewControllerをデリゲートとして割り当てるべきではありません...逆になります。

これらの行を削除してください...

// in ColorSwatch.m initWithCoder:
MyViewController *mvc = [[MyViewController alloc] initWithNibName:
                                           @"MyViewController" bundle:nil];
self.colorSwatchDelegate = mvc;

次に、MyViewController.mで..。

- (void)viewDidLoad {

    ColorSwatch *colorSwatchButton = [[ColorSwatch alloc] buttonWithType:UIButtonTypeCustom];

    // or place a ColorSwatch in the xib, on MyViewController's view... But not before you
    // you delete lines from initWithCoder, otherwise it's infinite circular allocation

    colorSwatchButton.frame = CGRectMake(/* ... */);
    colorSwatchButton addTarget:self action:@selector(csButtonPressed:) forControlEvent: UIControlEventTouchUpInside];
    // and so on...
    // now the important part:
    colorSwatchButton.colorSwatchDelegate = self;

    // see - the ViewController is in charge of allocation, sets itself up as the delegate
    [self.view addSubview:colorSwatchButton];
}

コードでボタンを作成する代わりに、IBを使用できます。

ステップ1:デリゲートをアウトレットにする...

@property (nonatomic, retain) IBOutlet id <ColorSwatchDelegate> colorSwatchDelegate;

ステップ2:IBでボタンを描画し、それらのクラスをColorSwatchに設定します。次に、viewDidLoadで記述したコードをスキップできます。

ステップ3:新しく配置されたボタンは、IBにアウトレットを表示するはずです。通常どおり、そこからMyViewControllerにドラッグできます。

于 2012-07-25T14:40:10.943 に答える
0

IBOutletに接続の問題がある可能性があります。テキストフィールドをphotoLabelTextFieldに接続するのを忘れている可能性があります。xibphotoLabelTextField

于 2012-07-25T14:03:14.463 に答える