我正在开发应用程序,我有一个要求,即有来电时会调用相应的方法。我写了alertview代码,它工作正常,并显示alertview。
Alertview包含两个按钮接受和拒绝,当我点击任何这些按钮时,不会调用alertview委托方法。
+ (void)incomingCallAlertView:(NSString *)string
{
UIAlertView *callAlertView=[[UIAlertView alloc] initWithTitle:string message:@"" delegate:self cancelButtonTitle:@"reject" otherButtonTitles:@"accept",nil];
[callAlertView show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
NSLog(@"clickedButtonAtIndex");
if(buttonIndex==0)
{
NSLog(@"buttonindex 0");
}
else
{
NSLog(@"buttonindex 1");
}
}
我使用主线程从另一个方法调用+(void)incomingcall
方法。
- (void)showIncomingcalling
{
[CallingViewController performSelectorOnMainThread:@selector(incomingCallAlertView:) withObject:@"on_incoming_call" waitUntilDone:YES];
}
我在类中编写协议,即<UIAlertViewDelegate>
,但代理方法没有被调用,任何人都可以提前解决我的问题。
答案 0 :(得分:19)
initWithTitle:string message:@"" delegate:self
^^
Here it is!
在类方法的上下文中,self
引用类本身,而不是对象的实例(类方法如何知道类的实例?)。因此,您必须将incomingCallAlertView:
方法转换为实例方法(即在其前面添加减号而不是加号,并在类名称中调用self
insetad showIncomingCalling
方法),或者将委托方法实现为类方法:
+ (void)alertView:(UIAlertView *)av clickedButtonAtIndex:(NSInteger)index
(这个确实有用,因为类对象本身是其元类的一个实例,这意味着类方法实际上只是元类的实例方法。)
等
顺便说一下,仔细阅读一篇体面的Objective-C教程和/或语言参考资料。这个问题不应该在这里被问到,因为它太基本了,不能在其他资源中查找。