0

我正在继承 UIAlertView。我想实现一个具有以下签名的 init 方法:

- (id)initWithTitle:(NSString *)title 
            message:(NSString *)message
         identifier:(NSInteger)ident
           delegate:(id)delegate 
  cancelButtonTitle:(NSString *)cancelButtonTitle 
  otherButtonTitles:(NSString *)otherButtonTitles,...

它只是添加了 param 的默认 UIAlertView 方法identifier

- (id)initWithTitle:(NSString *)title 
            message:(NSString *)message
           delegate:(id)delegate 
  cancelButtonTitle:(NSString *)cancelButtonTitle 
  otherButtonTitles:(NSString *)otherButtonTitles,...

如果我在编译时不知道我的 init 方法otherButtonTitles参数是什么,那么现在调用 super 方法的正确语法是什么?

self = [super initWithTitle:title
                    message:message
                   delegate:delegate
          cancelButtonTitle:cancelButtonTitle 
          otherButtonTitles:otherButtonTitles, nil];
//I will only get the first param with this syntax
4

2 回答 2

1

一、了解可变参数函数,它可以帮助你:维基百科

Example:
#include <stdarg.h>

void logObjects(id firstObject, ...) // <-- there is always at least one arg, "nil", so this is valid, even for "empty" list
{
  va_list args;
  va_start(args, firstObject);
  id obj;
  for (obj = firstObject; obj != nil; obj = va_arg(args, id)) // we assume that all arguments are objects
    NSLog(@"%@", obj);
  va_end(args);
}

其次,最好制作一个Objectve-C Category而不是子类UIAlertView

Example:
@interface UIAlertView(Identifiers)
- (id)initWithTitle:(NSString *)title 
            message:(NSString *)message
         identifier:(NSInteger)ident
           delegate:(id)delegate 
  cancelButtonTitle:(NSString *)cancelButtonTitle 
  otherButtonTitles:(NSString *)otherButtonTitles,...;
@end
于 2012-05-28T10:48:16.880 回答
0

文档说

子类化注释
UIAlertView 类旨在按原样使用,不支持子类化。此类的视图层次结构是私有的,不得修改。

但到了这一点,我认为你做不到。init你总是可以通过实现一个普通的然后用传入的参数配置对象来重新创建这个方便的方法。

于 2012-05-28T10:48:06.333 回答