2016-11-02 2 views
0

У меня есть UIButton в моем UICollectionViewCell и он получает данные от JSON. Теперь мне нужно открыть URL-адрес с каждой кнопки (каждая кнопка имеет другой URL-адрес, который также поступает из JSON).Открыть URL-адрес от UIButton в CollectionViewCell

мне удалось открыть URL с:

let weburl = "http://example.com" 
UIApplication.shared.openURL(URL(string: weburl)!) 

Но теперь мне нужно своего рода передать URL для каждой кнопки. Любые идеи о том, как я могу это достичь?

+0

Вам необходимо использовать делегатов. Отметьте это сообщение: http://stackoverflow.com/questions/24099230/delegates-in-swift – Eeshwar

ответ

1

Вы можете иметь массив адресов:

let urls = [url1, url2, ...] 

А затем присвоить свойство тега каждой кнопки с индексом соответствующей ссылке. Теперь вы можете легко управлять тем, что вы хотите:

@IBAction func handleTouch(_ sender: UIButton) { 
    // assumes that the buttons' tags start at 0, which isn't a good idea. 
    // see @rmaddy comment bellow 
    let url = urls[sender.tag] 
    // use the version of the open method shown bellow because the other one becomes deprecated in iOS 10 
    UIApplication.shared.open(URL(string: url)!, options: [:], completionHandler: nil) 
} 

EDIT

Другое решение было бы просто хранить URL в самой клетке, и в обработчике кнопки открыть URL, соответствующий его клетке.

+1

Несколько вещей, чтобы рассмотреть. Это предполагает, что вы устанавливаете тег каждой кнопки от 0 до n - 1, где n - количество кнопок. Тег 0 является значением по умолчанию для любого вида без явного тега. Лучше не полагаться на значение тега 0. Более важно, полагаться на тег кнопки является рискованным. Это не удается во многих случаях, например, если просмотр коллекции является динамическим (ячейки можно добавлять, удалять или переупорядочивать). – rmaddy

+0

@rmaddy Да, вы правы. Мне не нравится слишком много использовать это свойство, но иногда это помогает. Спасибо за подсказку. «Тег 0 - это значение по умолчанию для любого вида без явного тега. Лучше не полагаться на значение тега 0.» Я действительно помогаю избежать ошибок –

+0

Еще один soln: почему мы не можем создать подкласс UIButton и создать там URL-адрес свойства. и назначьте это с каждым URL-адресом. –

0

FYI OpenUrl осуждается в прошивке 10. Я предлагаю следующее, если вам необходимо поддерживать старые версии ИО:

let url = URL(string: "alexa://")! 
    if #available(iOS 10, *) { 
     UIApplication.shared.open(url, options: [:], completionHandler: { 
      (success) in 
      guard success else { 
       //Error here 
      } 
      //Success here 
     }) 
    } else { 
     if let success = UIApplication.shared.openURL(url) { 
      //Success here 
     } else { 
      //Error here 
     } 
    } 

В противном случае просто использовать UIApplication.shared.open. Также я бы добавил поле URL-адреса в модель данных, которую вы передаете в tableViewCell, и просто найдите URL-адрес из модели.

Смежные вопросы