Отображение проблем TableView и CustomCell на iPhone4s

У меня возникли проблемы с отображением таблиц и ячеек на iphone4s. В симуляторе и на новых устройствах все нормально.

  1. UITableViewController Нестандартная ячейка таблицы (рисунок 1) представлена ​​неправильно. Все ярлыки и т. Д. Лежат друг на друге. Они должны отображаться один под другим, как на симуляторе.

  2. ViewController с TableView Другие пользовательские ячейки даже не отображаются на iPhone4, появляется только серый квадрат.

Я использую Auto Layout. У вас есть какие-нибудь предложения?

12

Вот код: 1-е изображение:

import UIKit

class FeedController: TableViewController {
override func viewDidLoad() {
    super.viewDidLoad()

    // adjusting text size without quitting app
    NSNotificationCenter.defaultCenter().addObserver(self,
        selector: "onContentSizeChange:",
        name: UIContentSizeCategoryDidChangeNotification,
        object: nil)

    // set table row height
    tableView.estimatedRowHeight = 89
    tableView.rowHeight = UITableViewAutomaticDimension

    // removes the back button after clicked on send button to write a post
    self.navigationItem.hidesBackButton = true

    // refresh control
    self.refreshControl = UIRefreshControl()
    self.refreshControl!.addTarget(self, action: Selector("refresh:"), forControlEvents: UIControlEvents.ValueChanged)
    self.refreshControl!.backgroundColor = UIColor.grayColor()
    self.refreshControl!.tintColor = UIColor.whiteColor()
    self.tableView.addSubview(refreshControl!)
}

func reloadFeed(note: NSNotification){
    tableView.reloadData()
}

func refresh(sender: AnyObject){
    self.refreshControl!.endRefreshing()
}

// called when the text size was changed by the user 
func onContentSizeChange(notification: NSNotification) {
    tableView.reloadData()
}

}

import Foundation
import UIKit

class TableViewController: UITableViewController, UITableViewDelegate, UITableViewDataSource, PDeliversStatusAlerts {
let notifCenter = NSNotificationCenter.defaultCenter()

override init() {
    super.init()
    notifCenter.addObserver(self, selector: "displayConnectionLostAlert", name: kConnectionLostNotification, object: self)
}

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    notifCenter.addObserver(self, selector: "displayConnectionLostAlert", name: kConnectionLostNotification, object: self)
}


func displaySimpleAlert(#title:String, message:String){
    var alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil))
    self.presentViewController(alert, animated: true, completion: nil)
}

func displayModalDialog(#title: String, message: String, yesHandler: ((UIAlertAction!) -> Void)?, noHandler: ((UIAlertAction!) -> Void)?) {
    var alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Default, handler: yesHandler))
    alert.addAction(UIAlertAction(title: "Yes", style: UIAlertActionStyle.Default, handler: noHandler))

    self.presentViewController(alert, animated: true, completion: nil)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

func push(sender: AnyObject) {
}

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

override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    return false
}

2-я картинка:

import UIKit

class NextViewController: ViewController, UITableViewDelegate, UITableViewDataSource{

var followedFeed    : FollowedHashtagFeed?
var hottestFeed     : HottestHashtagFeed?
var nearbyFeed      : NearbyHashtagFeed?

var hashtagFeed     : HashtagFeed?

@IBAction func hottestButtonTapped(sender:AnyObject) {
    hashtagFeed = FeedFactory.instance().hottestHashtagFeed()
    notifCenter.removeObserver(self)
    notifCenter.addObserver(self, selector: "reloadFeed", name: hashtagFeed?.notificationName, object: nil)
    hashtagFeed!.subscribe()
    reloadFeed()
}

@IBAction func nearbyButtonTapped(sender: AnyObject) {
    hashtagFeed = FeedFactory.instance().nearbyHashtagFeed()
    notifCenter.removeObserver(self)
    notifCenter.addObserver(self, selector: "reloadFeed", name: hashtagFeed?.notificationName, object: nil)
    notifCenter.addObserver(self, selector: "didReceiveLocationPermissionNeededNotification:", name: "location_permission_needed", object: nil)
    hashtagFeed!.subscribe()
    reloadFeed()
}

@IBAction func followedButtonTapped(sender: AnyObject) {
    hashtagFeed = FeedFactory.instance().followedHashtagFeed()
    notifCenter.removeObserver(self)
    notifCenter.addObserver(self, selector: "reloadFeed", name: hashtagFeed?.notificationName, object: nil)
    hashtagFeed!.subscribe()
    reloadFeed()
}


override func viewDidLoad() {
    super.viewDidLoad()


    //set table row height
    tableView.rowHeight = UITableViewAutomaticDimension

    //load feed cell
    var nipName=UINib(nibName: "NextTableCell", bundle:nil)
    self.tableView.registerNib(nipName, forCellReuseIdentifier: "nextCell")

    followedButtonTapped(followedButton)


    view.setNeedsLayout()
    view.layoutIfNeeded()

    println("Frame Height:")
    println(tableView.frame.height)
    println(tableView.bounds.height)
    println("Frame Width:")
    println(self.tableView.frame.width)
    println(self.tableView.bounds.width)

    /*
    hashtagFeed = FeedFactory.instance().followedHashtagFeed()

    //subscribe to feed changes
    notifCenter.addObserver(self, selector: "reloadFeed", name: hashtagFeed?.notificationName, object: nil)
    hashtagFeed!.subscribe()*/
}

func didReceiveLocationPermissionNeededNotification(note: NSNotification){
    displayModalDialog(
        title:      "Location Permission Needed",
        message:    "In order to use this functionality the app needs your permission to use location data - do you want to give this permission now?",
        yesHandler: {
            (action: UIAlertAction!) in LocationHelper.instance().askForPermission()
        },
        noHandler: nil
    )
}



//Tableview

func reloadFeed(){
    tableView.reloadData()
}

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

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

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("nextCell", forIndexPath: indexPath) as NextTableCell
    let hashtag = hashtagFeed!.toArray()[indexPath.row]
    cell.loadItem(hashtag)
    return cell
}

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

}

1 ответ

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

Например, если у вас есть ячейка, которая содержит одно подпредставление, и подпредставление имеет ограничения top/bottom/left/right для своего суперпредставления (ближайшего соседа, то есть contentView ячейки) размером 10px, но само подпредставление не имеет высоты ограничение, ячейка не будет правильно размещена.

Это может выглядеть как все ячейки друг над другом или все ячейки с высотой по умолчанию 44px.

Чтобы устранить проблему (если мы работаем с примером иерархии представлений ячейки с одним подпредставлением), определите ограничение высоты для подпредставления. Вам также может потребоваться установить приоритет ограничения высоты на значение, меньшее 1000.

Не уверен, что это решит вашу конкретную проблему, но она исправила аналогичные проблемы для меня, поэтому представьте это здесь в качестве опции.

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

Другие вопросы по тегам