2016-02-08 1 views
0

У меня есть два UILabels с двумя UITapGestureRecognizers в UITableViewCell.Как узнать идентификатор отправителя в Swift

cell.Username.tag = indexPath.row 
cell.SharedUser.tag = indexPath.row 
let tapGestureRecognizer2 = UITapGestureRecognizer(target:self, action:"GoToProfil:") 
let tapGestureRecognizer3 = UITapGestureRecognizer(target:self, action:"GoToProfil:") 
cell.Username.userInteractionEnabled = true 
cell.Username.addGestureRecognizer(tapGestureRecognizer2) 
cell.SharedUser.userInteractionEnabled = true 
cell.SharedUser.addGestureRecognizer(tapGestureRecognizer3) 

func GoToProfil (sender: AnyObject!) { 
    self.performSegueWithIdentifier("GoToProfilSegue", sender: sender) 
} 

Я использую Segue нажать другую UIViewController, и я переопределение функции PrepareSegue, чтобы отправить необходимую информацию, соответствующую Sender тега.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 

    let ProfilView = segue.destinationViewController as! Profil 
    ProfilView.hidesBottomBarWhenPushed = true 
    ProfilView.title = posts[sender.view!.tag].User?.objectForKey("Name") as? String 
    ProfilView.User = posts[sender.view!.tag].User 
} 

Моя проблема заключается в том, что я хочу знать, какая UILabel была нажата, зная, что я уже использую tag.

+0

Что такое 'UITextLabel'? Нет такого понятия. – rmaddy

+0

Извините, я отредактировал сообщение, я имел в виду UILabel –

+0

Вы можете добавить другую функцию, которая будет вызываться, когда второй UILabel будет прослушиваться. Затем эта функция вызовет другой идентификатор seg, такой как 'performSegeueWithIdentifier (« GoToProfilSeg2 »)'. Затем в вашем методе 'prepareForSegue' вы просто используете оператор' if', чтобы обрабатывать, какой segue нужно перенести, то есть 'if segue.identifier ==" ... "" {...} ' – MikeG

ответ

4

Функция GoToProfile: должна быть написана правильно. Параметр не является «отправителем», это распознающий жест.

func GoToProfil (gestureRecognizer: UITapGestureRecognizer) { 
} 

Оттуда вы можете определить метку, используя view свойство жест распознаватель.

Но у вас, похоже, есть два противоречащих друг другу требования. Вы хотите узнать, какая из этих двух меток была использована, и вы хотите узнать, в какой строке находится метка.

Обычно вы должны использовать ярлык tag, чтобы узнать, какая из двух этикеток была использована. Но вы используете их теги для отслеживания строки.

Решение, которое я рекомендую, это использовать тег, чтобы различать две метки. Затем вы можете рассчитать строку на основе фрейма метки.

См. the following answer для примера кода, который переводит рамку подкатегории ячейки в ячейку indexPath.

+0

Можете ли вы показать, как определить ярлык, используя свойство вида, это то, что мне не хватает –

+0

Я не знаю Swift, но что-то вроде 'let label = gestureRecognizer.view как UILabel'. Я уверен, что это не 100% правильно, но это должно помочь. – rmaddy

+0

Кажется не работает –

0

Вы можете получить доступ к данным отправителя и прочитать тег объекта, который отправляет вас, как в этом примере кода.

Чтобы однозначно идентифицировать каждую строку и каждый ярлык, вы можете использовать что-то вроде этого:

  • cell.Username.tag = (indexPath.row*2)
  • cell.SharedUser.tag = (indexPath.row*2)+1

с этим, если у вас есть даже тег, сво Имя пользователя , нечетным будет SharedUser. Разделение на пол 2 вы можете иметь строку назад.

@IBOutlet weak var test1: UILabel! 
@IBOutlet weak var test2: UILabel! 



override func viewWillAppear(animated: Bool) { 
    test1.tag = 1 
    test2.tag = 2 

    test1.userInteractionEnabled = true 
    test2.userInteractionEnabled = true 

    self.test1.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleSingleTap:")) 
    self.test2.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleSingleTap:")) 
} 

func handleSingleTap(sender: UITapGestureRecognizer) { 
    print(sender.view?.tag) 
} 
+0

'sender' не является ярлыком, это распознающий жест. – rmaddy

+0

Плохо, я взял код с кнопки и забыл о кране ... код теперь правильный. – UlyssesR

+0

Это лучше, но OP использует тег метки для 'indexPath.row'. – rmaddy

1

сделать следующие предположения:

  1. Вы пытаетесь однозначно определить метку с помощью UIView.tag
  2. Вы хотите другое поведение Имя & SharedUser

Я рекомендую следующее, сначала определите свои теги под вашим #imports

#define kUsername 1 
#define kSharedUser 2 

Затем назначить их взгляды

cell.Username.tag = kUsername 
cell.SharedUser.tag = kSharedUser 

Затем в prepareSegue

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
    int tag = [sender.view!.tag] 
    if (tag == kUsername) { 
     //Username logic 
    } else if(tag == kSharedUser) { 
     //Shared User Logic 
    } 
} 

Таким образом, вы можете легко и просто определить, кран, Обратите внимание, это может иметь разные результаты, если у вас есть более 1 Имя пользователя & SharedUser labels. Затем вам нужно будет либо больше #defines, либо изменить способ генерации тэгов.

1

Вы можете добавить собственность к UILabel, чтобы отслеживать тип этикетки. (Я использовал перечисление, так как есть только два случая, но это может быть строка и т.д.)

enum LabelDest : String 
{ 
    case Username = "Username" 
    case SharedUser = "SharedUser" 
} 

extension UILabel 
{ 
    struct Static { 
     static var key = "labelDest" 
    } 
    var labelDest:LabelDest? { 
     set { objc_setAssociatedObject(self, &Static.key, newValue?.rawValue, .OBJC_ASSOCIATION_COPY_NONATOMIC) 
     } 
     get { 
      guard let val = objc_getAssociatedObject(self, &Static.key) as? String else { return nil } 
      return LabelDest(rawValue:val) 
     } 
    } 
} 

Теперь вы можете просто сделать это:

let label = UILabel() 
label.labelDest = .Username 

Позже:

switch label.labelDest 
{ 
    case .Some(.Username): 
     // handle user name 
     break 
    ... 

Если вы хотите использовать поле .tag на своих ярлыках, вы можете использовать другую технику, чтобы найти строку таблицы, связанную с меткой: (снова используя класс расширения)

extension UIView 
{ 
    var enclosingTableViewCell:UITableViewCell? { 
     return superview?.enclosingTableViewCell 
    } 
    var enclosingTableView:UITableView? { 
     return superview?.enclosingTableView 
    } 
} 

extension UITableViewCell 
{ 
    var enclosingTableViewCell:UITableViewCell? { 
     return self 
    } 
} 

extension UITableView 
{ 
    var enclosingTableView:UITableView? { 
     return self 
    } 
} 

extension UIView { 
    var tableRow:Int? { 
     guard let cell = self.enclosingTableViewCell else { return nil } 
     return self.enclosingTableView?.indexPathForCell(cell)?.row 
    } 
} 

Теперь, с вашего жеста распознавателя действия:

func goToProfil(sender:UIGestureRecognizer!) 
{ 
    guard let tappedRow = sender.view?.tableRow else { return } 
    // handle tap here... 
} 
+0

Вы также можете установить это свойство в IB, используя дополнительную панель свойств среды выполнения (я думаю, это то, что она называется) – nielsbot

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

  • Нет связанных вопросов^_^