2014-09-18 19 views
6

Ich gehe schon seit einiger Zeit im Kreis und nichts, was ich in ähnlichen Beiträgen gefunden habe, scheint es zu lösen. Ich programmiere programmatisch eine Tabelle zu einer benutzerdefinierten UIView. Der Tabellen- und Zeilentext wird korrekt angezeigt, aber weder didSelectRowAtIndexPath noch willdSelectRowAtIndexPath werden ausgelöst, wenn ich dies im Simulator ausführe und versuche, auf eine der Zeilen zu klicken.didSelectRowAtIndexPath wird nicht aufgerufen (Swift)

Die entsprechenden Bits meines Codes unter:

import UIKit 
import AVFoundation 

@IBDesignable 
class PerformanceQuestionView: UIView, UITableViewDelegate, UITableViewDataSource { 

var optionsTable = UITableView(frame: CGRectMake(10,200,250,200)) 

var optionItems = ["One", "Two", "Three", "Four"] 

convenience init(rect: CGRect, performanceQuestion:PerformanceQuestion?) { 
    self.init(frame: rect) 

    NSLog("PerformanceQuestionView.init()") 

    self.optionsTable.dataSource = self 
    self.optionsTable.delegate = self 
    self.optionsTable.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell") 
    self.optionsTable.allowsSelection = true 
} 

func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int { 
    NSLog("numberOfRowsInSection") 
    return optionItems.count 
} 

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { 
    NSLog("cellForRowAtIndexPath") 
    var cell:UITableViewCell = self.optionsTable.dequeueReusableCellWithIdentifier("cell") as UITableViewCell 

    cell.textLabel.text = self.optionItems[indexPath.row] 

    return cell 
} 

func tableView(tableView: UITableView!, willSelectRowAtIndexPath indexPath: NSIndexPath!) -> NSIndexPath! { 
    NSLog("You will select cell #\(indexPath.row)!") 
    return indexPath 
} 

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) { 
    NSLog("You selected cell #\(indexPath.row)!") 
} 

override func layoutSubviews() { 

    super.layoutSubviews() 

    self.addSubview(optionsTable) 
} 

} 
+0

verbinden Sie Ihre Tableview-Datenquelle und Delegate von Storyboards.? –

+0

@NitinGohel Sie sind in der Init-Methode verbunden. –

+0

bettero zum Überprüfen einmal verbinden von storyBoard –

Antwort

3

entfernen die Ausrufungszeichen:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

} 
+0

Danke Aaron, aber immer noch nicht funktioniert. –

+3

@JavierArtiles Etwas in Ihrer Sichthierarchie blockiert möglicherweise die Berührungen. Ist der "PerformanceQuestionView" -Rahmen mindestens so groß wie der Rahmen der Tabelle? –

+1

@Aaron Brager danke, ich habe den gleichen Fehler Ich entferne den UITapGestureRecognizer und funktioniert gut !! – Fabio

18

die TapGestureRecognizer für mich gearbeitet Entfernen !!!

// var backgoroundTap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "DismissKeyboard") 
    // self.view.addGestureRecognizer(backgoroundTap) 
+1

funktioniert für mich auch, aber was ist, wenn wir die Tippgeste verwenden müssen ...? –

+1

erstellen Sie eine separate Ansicht und laden Sie die Beschriftungen und Schaltflächen in dieser Ansicht. Fügen Sie dann die Geste für diese Ansicht hinzu. Es wird klappen. – AAA

+0

Danke werde es versuchen ..! –

0

Ich habe das gleiche Problem lange Zeit, ich bin für denken, es ist ein Fehler in UITableView programmatisch beim Erstellen einer UIView-Klasse.

Meine temporäre Lösung und obwohl es keine gute Idee ist, aber es funktioniert. Es ist eine Schaltfläche die Größe der Zelle platzieren und eine Aktion von einem Protokoll ausgelöst, um diese Aktion zumindest zu simulieren.

Es ist keine gute Übung, aber konnte nicht länger dort stecken bleiben.

7

Grund dafür könnte sein, dass Sie eine Schwenkbewegung in der Ansicht verwenden. wie AAA erwähnt Entfernen der Pan-Geste wird den Trick tun. Aber wenn Sie immer noch die Pfanne Geste verwenden möchten können Sie wie folgt vorgehen

let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard") 
    view.addGestureRecognizer(tap) 
    tap.cancelsTouchesInView = false 

machen cancelsTouchesInView false ermöglicht alles, was Sie tippt.

+1

Danke ein lotttttttt – fandro

0

Dies wurde in Swift veraltet 3:

override func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){ 
    ... 
} 

und ersetzt durch:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    ... 
} 
0

für Swift 3.0, müssen Sie genau diese Funktion nutzen:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
.... 

} 

Blick sehr um sicherzustellen, dass Sie diese Funktion verwenden. Der Compiler wird sich nicht beschweren, wenn Sie NSIndexPath haben oder Sie _ vor TableView nicht haben, aber es wird nicht funktionieren. Benutzen Sie diese Funktion, setzen Sie einen Haltepunkt und Sie werden sehen, dass es an diesen Punkt geht, wenn Sie auf eine Zeile tippen.

Ich habe dies mit einer statischen Tabelle (alle Zellen mit statischem Inhalt) getestet.

0

Ich habe alle in dieser Frage aufgeführten Methoden und andere ausprobiert. Ich löschte die Tabelle schließlich aus meinem Storyboard und begann erneut.

In meinem Storyboard fügte ich die Tabelle zurück, fügte eine Prototypzelle hinzu. Ich habe den ViewController mit der Tabelle verbunden. Ich habe die Tabelle mit meiner dataSource verbunden und Methoden delegiert.

Ich habe die Prototyp-ID im Attribute Inspector benannt.

Das funktionierte für mich. Ich hatte anscheinend keinen Code, um mich zu ändern.

Verwandte Themen