1

UIButton別の からメソッドを呼び出すがUIViewControllerあります。そのメソッドは、発生していないデリゲート メソッドを呼び出します。

何かのようなもの:

FirstViewController

-(void)viewWillAppear:(BOOL)animated {
//Submit Button
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button addTarget:self 
               action:@selector(someMethod)
     forControlEvents:UIControlEventTouchDown];
    [button setTitle:@"Submit" forState:UIControlStateNormal];
    button.frame = CGRectMake(100.0, 120.0, 80.0, 40.0);
    [self addSubview:button];
}

- (void)someMethod {

 SecondViewController *viewC = [[SecondViewController alloc] init];
 [viewC otherMethod];

} 

SecondViewController

- (void)otherMethod {

 NSLog(@"Verification.....");
 [self.delegate foo:self Bar:self.text]; //not working when called the otherMethod from FirstViewController

} 

私はそれを間違った方法で行っていることを知っています。

4

3 に答える 3

3

Objective-C でプロトコルとデリゲートが機能する方法の非常に単純な例

@class A;
@protocol DelegateName<NSObject>
@optional
  - (void)doSomething:(NSString *)text;
@end

@interface A: NSObject {
    NSString *bar;
    id <DelegateName> delegate;
}

@property (nonatomic, retain) NSString *bar;
@property (nonatomic, assign) id <DelegateName> delegate;

- (void)someAction;

@end

これはプロトコル宣言です。次に、デリゲート メソッドを呼び出すときは、デリゲート メソッドを呼び出すクラスのオブジェクトが必要です。あなたの場合はですvc。次のようにデリゲートを設定します。

[vc setdelegate: self];

次に、行ったようにメソッドを呼び出します。

この例から抜けている点がないか確認してください。

于 2012-05-12T14:32:14.370 に答える
1

デリゲート メソッドがどのように機能するかを理解してください。

@protocol CPUPerformanceDelegate <NSObject>

-(void)getUsedCpuOperations:(float)percent;
-(void)getKernelCpuOperations:(float)percent;
-(void)getIdleCpuOperations:(float)percent;
-(void)getUserCpuOperations:(float)percent;
-(void)getNiceCpuOperations:(float)percent;

@end

@interface CPUPerformance : NSObject{

    processor_info_array_t          cpuInfo, prevCpuInfo;
    mach_msg_type_number_t          numCpuInfo, numPrevCpuInfo;
    unsigned                        numCPUs;

    NSLock                          *CPUUsageLock;



}
@property(nonatomic,assign)id<CPUPerformanceDelegate>delegate;
@property(nonatomic,retain)NSTimer                         *updateTimer;
@end

それで

#import "CPUPerformance.h"



@implementation CPUPerformance
@synthesize delegate,updateTimer;
- (void)updateInfo
{
idlepercent = ((idle/total)*100);
                userpercent = (user/total)*100;
                syspercent = (sys/total)*100;
                nicepercent = (nice/total)*100;
                inUsepercent = (inUse/total)*100;
[delegate getIdleCpuOperations:idlepercent];
            [delegate getKernelCpuOperations:syspercent];
            [delegate getNiceCpuOperations:nicepercent];
            [delegate getUsedCpuOperations:inUsepercent];
            [delegate getUserCpuOperations:userpercent];
}

そして最後に

#import "CPUPerformance.h"
@interface SpecProjectFirstViewController : UIViewController<UITableViewDataSource,UITableViewDelegate,CPUPerformanceDelegate>{

    //Ivars

    NSMutableArray                  *processArray;
    //User Interface Object
    UILabel                         *cpuUsage;
    UILabel                         *cpuIdle;
    UILabel                         *cpuUser;
    UILabel                         *cpuNice;
    UILabel                         *cpuKernel;
    IBOutlet UITableView            *tableViews;
    CPUPerformance                  *cpuObject;

}
=================

#import "SpecProjectFirstViewController.h"


@implementation SpecProjectFirstViewController

-(void)getIdleCpuOperations:(float)percent{

     [cpuIdle setText:nil];

      [cpuIdle setText:[NSString stringWithFormat:@"Idle :%.0f %%",percent]];
     [cpuIdle setTextAlignment:UITextAlignmentCenter];
}

-(void)getKernelCpuOperations:(float)percent{
    [cpuKernel setText:nil];

    [cpuKernel setText:[NSString stringWithFormat:@"Kernel :%.0f %%",percent]];
    [cpuKernel setTextAlignment:UITextAlignmentCenter];
}


-(void)getNiceCpuOperations:(float)percent{
     [cpuNice setText:nil];

    [cpuNice setText:[NSString stringWithFormat:@"Nice :%.0f %%",percent]];
    [cpuNice setTextAlignment:UITextAlignmentCenter];
}

-(void)getUsedCpuOperations:(float)percent{

    [cpuUsage setText:nil];
    [cpuUsage setText:[NSString stringWithFormat:@"Used :%.0f %%",percent]];
    [cpuUsage setTextAlignment:UITextAlignmentCenter];
}
于 2012-05-12T14:17:50.600 に答える
0

呼び出したいメソッドにデリゲートが応答することを検証するのが通例であるため、otherMethodメソッドを次のように実装し、デバッグに役立つログを追加する必要があります。

- (void)otherMethod
{
    NSLog(@"delegate = %p", self.delegate);

    if ([self.delegate respondsToSelector:@selector(foo::)])
    {
        NSLog(@"Calling delegate foo");
        [self.delegate foo:self Bar:self.text];
    }
    else
    {
        NSLog(@"Delegate doesn't respond to foo");
    }
} 
于 2012-05-12T14:39:46.823 に答える