SOAP в настоящее время имеет преимущество лучших инструментов, где они генерируют много шаблонного кода для обоих уровень служб, а также генерирующиеся клиенты от любого данного WSDL.
REST более прост, может быть легче поддержать, в результате лежит в основе веб-архитектуры, допускает лучшую видимость протокола и, как доказывали, масштабировался в размере самого WWW. Некоторые платформы там помогают Вам создать сервисы REST, как Ruby on Rails, и некоторые даже помогают Вам с пишущими клиентами, как Услуги передачи данных ADO.NET. Но по большей части, поддержке инструмента недостает.
Вы можете просто добавить их в правильном порядке, а затем вручную установить cancelButtonIndex
и destructiveButtonIndex
.
Для примера кода:
if (self = [super initWithTitle:title delegate:self cancelButtonTitle:nil destructiveButtonTile:nil otherButtonTitles:nil]) {
if (firstButton) {
id buttonTitle;
int idx = 0;
va_list argList;
va_start(argList, firstButtton);
while (buttonTitle = va_arg(argList, id)) {
[self addButtonWithTitle:buttonTitle]
idx++;
}
va_end(argList);
[self addButtonWithTitle:cancel];
[self addButtonWithTitle:destroy];
self.cancelButtonIndex = idx++;
self.destructiveButtonIndex = idx++;
}
}
return self;
Ответ Авиада Бен Дова правильный, однако счетчик индексов кнопок не нужен для установки индексов уничтожения и отмены. Метод addButtonWithTitle: возвращает индекс только что использованной кнопки, поэтому мы можем сразу использовать это значение следующим образом:
if (self = [super initWithTitle:title delegate:self cancelButtonTitle:nil destructiveButtonTile:nil otherButtonTitles:nil]) {
if (firstButton) {
id buttonTitle;
va_list argList;
va_start(argList, firstButtton);
while (buttonTitle = va_arg(argList, id)) {
[self addButtonWithTitle:buttonTitle]
}
va_end(argList);
self.cancelButtonIndex = [self addButtonWithTitle:cancel];
self.destructiveButtonIndex = [self addButtonWithTitle:destroy];
}
}
return self;