UITableView没有显示数据,没有调用cellForRowAtIndexPath

时间:2016-03-14 03:43:30

标签: ios swift uitableview

我遇到UITableView问题 问题是当我运行SidePanelViewController时没有显示任何内容。我错过了什么?我没有收到任何错误,只是一个空的桌面视图。

SidePanelViewController Storyboard SidePanelViewController

这是我的代码

class SidePanelViewController : BackgroundViewController {

var delegate: SidePanelViewControllerDelegate?

@IBOutlet weak var profileImageView: UIImageView!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var name2Label: UILabel!
@IBOutlet weak var menuTableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    profileImageView.sd_setImageWithURL(NSURL(string: Me.read(Me.Key.profileImage) as! String))
    nameLabel.text = Me.read(Me.Key.displayName) as? String
    name2Label.text = Me.read(Me.Key.displayName2) as? String

    let adapter = SidePanelTableAdapter(sidePanels: Constants.menu)
    adapter.tableView = menuTableView
    menuTableView.delegate = adapter
    menuTableView.dataSource = adapter
    menuTableView.reloadData()
}
}

我创建了一个名为SidePanelTableAdapter的新类,实现了UITableViewDataSource和UITableViewDelegate

class SidePanelTableAdapter: NSObject {

var tableView: UITableView!
var sidePanels: [SidePanel]
var total = 0

init(sidePanels: [SidePanel]) {
    self.sidePanels = sidePanels
    total = sidePanels.count
    print ("total \(total)")
}
}
extension SidePanelTableAdapter: UITableViewDelegate {

func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
    if isExpanded[indexPath.row] {

    }
}
}
extension SidePanelTableAdapter: UITableViewDataSource {

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    print("count \(self.total)")
    return self.total
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    print("ih wow")
    let row  = indexPath.row
    let cell = tableView
        .dequeueReusableCellWithIdentifier("SidePanelTableViewCell", forIndexPath: indexPath) as! SidePanelTableViewCell
    cell.navImageView.sd_setImageWithURL(NSURL(string: sidePanels[row].iconUrl))
    cell.navTitle.text = sidePanels[row].name
    print("get \(cell)")
    return cell
}
}
我有8个数据。为了确保,我打印数据numberOfRowsInSection, 在日志中输出是正确的 - > “伯爵8”。

但是没有调用cellForRowAtIndexPath。再次确保我用该方法打印文本 - > “哇哇”。但是“哇哇”没有出现在日志中。

有什么想法吗? 谢谢。

2 个答案:

答案 0 :(得分:3)

你这么说:

let adapter = SidePanelTableAdapter(sidePanels: Constants.menu)
adapter.tableView = menuTableView
menuTableView.delegate = adapter
menuTableView.dataSource = adapter
menuTableView.reloadData()

现在想想代码结束时会发生什么。 adapter是局部变量,是局部变量中的SidePanelTableAdapter对象。代码结束,本地变量被销毁,和SidePanelTableAdapter被销毁。因此,您将看到一个没有SidePanelTableAdapter的视图(表视图)来控制它。您的SidePanelTableAdapter代码永远不会运行,因为您的SidePanelTableAdapter 不存在

这里你想要做的就是将adapter分配到SidePanelViewController的属性中,以便它持续

答案 1 :(得分:0)

确定。我只是解决了这个问题,感谢@Matt提供的信息。 喜欢亚光说。在调用viewDidLoad()方法之后销毁适配器。

所以我改变了我的代码

- (void)viewDidLoad {
    [super viewDidLoad];
    //have a property named label
    self.label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
    [_label setText:@"LABEL"];
    [_label setBackgroundColor:[UIColor redColor]];

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setFrame:CGRectMake(0, 0, 100, 50)];
    [button addTarget:self action:@selector(tapDown) forControlEvents:UIControlEventTouchDown];
    [button addTarget:self action:@selector(tapCancel) forControlEvents:UIControlEventTouchUpInside];
    [button addTarget:self action:@selector(tapCancel) forControlEvents:UIControlEventTouchUpOutside];
    [self.view addSubview:button];

    [button addSubview:_label];   
}

-(void)tapDown{
    _label.backgroundColor=[UIColor blueColor];
}

-(void)tapCancel{
    _label.backgroundColor=[UIColor redColor];
} 

到此:

class SidePanelViewController : BackgroundViewController {

var delegate: SidePanelViewControllerDelegate?

@IBOutlet weak var profileImageView: UIImageView!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var name2Label: UILabel!
@IBOutlet weak var menuTableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    profileImageView.sd_setImageWithURL(NSURL(string: Me.read(Me.Key.profileImage) as! String))
    nameLabel.text = Me.read(Me.Key.displayName) as? String
    name2Label.text = Me.read(Me.Key.displayName2) as? String

    let adapter = SidePanelTableAdapter(sidePanels: Constants.menu)
    adapter.tableView = menuTableView
    menuTableView.delegate = adapter
    menuTableView.dataSource = adapter
    menuTableView.reloadData()
}
}

也许是因为我之前是Android开发人员,而iOS中的新用户仍然使用java的模式。 我想我应该从你身上学到更多东西。 谢谢大家。