构造一个以 nil 结尾的 NSString 列表作为 NSString *

Posted

技术标签:

【中文标题】构造一个以 nil 结尾的 NSString 列表作为 NSString *【英文标题】:Constructing a nil-terminated NSString list as an NSString * 【发布时间】:2011-12-30 21:10:03 【问题描述】:

SDK 中有许多方法要求提供一个以 nil 结尾的字符串列表,例如在 UIActionSheet 中:

- (id)initWithTitle:(NSString *)title delegate:(id < UIActionSheetDelegate >)delegate cancelButtonTitle:(NSString *)cancelButtonTitle destructiveButtonTitle:(NSString *)destructiveButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ...

'otherButtonTitles' 在这种情况下是一个以 nil 结尾的 NSString 列表。我想做的是用构造的 NSStrings 的 NSMutableArray 调用这个方法,因为我想动态地创建和排序参数。我该怎么做?在这种情况下,我不确定如何创建一个指向 NSStrings 的以零结尾的指针,并且如果将它传入甚至可以工作。我必须手动为其分配内存并释放它吗?

【问题讨论】:

【参考方案1】:

不能将任何数组转换为可变参数列表。

但是,对于 UIActionSheet,您可以在工作表创建后添加那些 otherButtonTitles,使用 -addButtonWithTitle:

UIActionSheet* sheet = [[UIActionSheet alloc] initWithTitle:...
                                                        /*etc*/
                                          otherButtonTitles:nil];
for (NSString* otherButtonTitle in otherButtonTitlesArray)

   [sheet addButtonWithTitle:otherButtonTitle];

【讨论】:

如果您在 UIActionSheet 上设置取消按钮,这不是一个好的解决方案。当您初始化工作表,然后使用上面的循环添加 otherButtons 时,您的取消按钮将由于某种原因最终位于它们之上。 应该可以解决问题。 [sheet setCancelButtonIndex:[sheet numberOfButtons] - 1]; @mtwagner 不,这只会改变按钮的样式 - 而不是它们出现的顺序 没有办法创建一个以nil结尾的字符串列表吗??【参考方案2】:

我还需要制作动态操作表。所以我做了一个大部分是空的行动表。添加了我的按钮。然后添加取消按钮并将其标记为取消。

sheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:homeName, nil];    
[sheet addButtonWithTitle:otherButton1];
[sheet addButtonWithTitle:otherButton2];
[sheet addButtonWithTitle:@"Cancel"];
[sheet setCancelButtonIndex:[sheet numberOfButtons] - 1];
sheet.actionSheetStyle = UIActionSheetStyleBlackTranslucent;
[sheet showInView:self.view];
[sheet release];

【讨论】:

这是一个比已接受的答案更完整的答案。谢谢!【参考方案3】:

你确定 CAN 将 NSArray 转换为 va_list。例如与NSString 一起使用

- (id)initWithFormat:(NSString *)format arguments:(va_list)argList

像这样:

+ (id)stringWithFormat:(NSString *)format array:(NSArray *)arguments;

    NSRange range = NSMakeRange(0, [arguments count]);
    NSMutableData *data = [NSMutableData dataWithLength:sizeof(id) * [arguments count]];
    [arguments getObjects:(__unsafe_unretained id *) data.mutableBytes range:range];
    return [[NSString alloc] initWithFormat:format arguments:data.mutableBytes];

【讨论】:

说你可以做到这一点很好,指向不同的用例;但是对于 OP 给出的用例,你能做到吗? 这是已接受答案的第一行的注释,因此您的注释不是必需的

以上是关于构造一个以 nil 结尾的 NSString 列表作为 NSString *的主要内容,如果未能解决你的问题,请参考以下文章

解析的NSString使用CHCSVParser返回nil

在 iOS 4.2 SDK 中返回 NSString 的函数总是返回 nil

php加密文件 解密data 转nsstring 为nil. rc4 ios

解决NSData转NSString返回nil的问题

从 NSDictionary 解析 NSString 值返回 nil

如何在NSString中每个单词的开头和结尾添加一个字符