为啥 UIActionSheet init 方法接受字符串数组而不是 NSString
Posted
技术标签:
【中文标题】为啥 UIActionSheet init 方法接受字符串数组而不是 NSString【英文标题】:Why UIActionSheet init method accepts an array of string instead of a NSString为什么 UIActionSheet init 方法接受字符串数组而不是 NSString 【发布时间】:2011-07-27 10:18:27 【问题描述】:这确实是一个新手问题,但它会帮助我更好地理解 Objective-c 的工作原理。我在 ios 应用程序中使用了 UIActionSheet。查看文档,这是相关的 init 方法:
- (id)initWithTitle:(NSString *)title delegate:(id < UIActionSheetDelegate >)delegate cancelButtonTitle:(NSString *)cancelButtonTitle destructiveButtonTitle:(NSString *)destructiveButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ...
其中 otherButtonTitles 是一个逗号分隔的 NSString 列表。在我看来,这与 NSArray 相对应,所以为了造成崩溃,我尝试了:
NSArray *buttons = [NSArray arrayWithObjects:@"B1",@"B2",nil];
UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"Actions" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Delete" otherButtonTitles:buttons];
然后显然应用程序由于按钮 NSArray 而崩溃。 这听起来与 Java varargs 非常相似,在一个类中你可以有类似的东西:
public void myMethod(String... param) ...;
对该方法的合法调用是:
myClass.myMethod("x");
myClass.myMethod("x","Y");
我的 iOS 应用中有很多使用 NSArray 的方法:
[myClass myMethod:[NSArray arrayWithObjects:....]];
避免分配 NSArray 而是传递逗号分隔的 NSString 列表对我来说非常方便。我怎样才能做到这一点 ?我的意思是,从 myMethod 的角度来看,接收到什么类型的参数以及应该如何考虑它?例如,我怎样才能循环通过 NSString ???
谢谢
【问题讨论】:
【参考方案1】:根据您的示例,以下应该有效:
UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"Actions" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Delete" otherButtonTitles:@"B1",@"B2",nil];
它并不比听起来更复杂。 “逗号分隔的 NSString 列表”只不过是一个 NSString 列表,用逗号分隔。
【讨论】:
嗯,可能是因为其他原因而崩溃。但是,为什么 UIActionSheet 中的参数没有标记为 (NSArray*)otherButtonTitles ? 因为它不带数组,所以它需要一个逗号分隔的 NSString 列表。 对不起,我又看了你的回答,这不是我一开始就问的。我知道您的示例有效,实际上这就是我设置它的方式。但我想了解为什么 NSString 的签名也可以是“逗号分隔的 NSString”,而不仅仅是 NSString。我试图在文档中找到这方面的证据,以及如何在自定义方法的情况下解析逗号分隔列表。 特别是,只是一点点OT,这在动态创建按钮的情况下可能非常有用。例如,我怎样才能写出类似 NSString *dynamicButtons = [作为 Objective-c 新手之王,我有点误解了。正如格雷厄姆所指出的,该方法确实使用了可变参数。乍一看我完全错过了这一点,Java varargs 表示法在 Objective-c 中有这个等价物:
public void myMethod(String... var);
-(void)myMethod:(NSString*)var,...;
事实上,如果你看一下 UIActionSheet 方法签名,它在其他按钮的部分中放置了完全相同的三点符号:
otherButtonTitles:(NSString *)otherButtonTitles, ...
对于在objective-c中处理变量参数,我发现了一个非常有用的链接:
http://cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html
说到我的问题,我可以通过实现“三点符号”安全地重写我的所有方法,并丢弃所有不必要的 NSArray。
【讨论】:
以上是关于为啥 UIActionSheet init 方法接受字符串数组而不是 NSString的主要内容,如果未能解决你的问题,请参考以下文章
iOS开发-56案例BUG:button的enabled控件的userInteractionEnabled以及两种提示框UIAlert和UIActionSheet
为啥 Counter 的 __init__ 方法称为描述符?
为啥在 init 方法中为 iVar 定义调用 autorelease?