2017-02-07 9 views
0

iOS開発に関してロープを習得するために、私はさまざまなFacebookのような "投稿"とテーブルビューを作成しようとしています。この質問のために私はXIBだ "フォトポスト" を参照する以下見ることができます:iOS Swift:TableViewCellを適切に初期化する

PhotoPostTableViewCell.xib:

enter image description here

class PhotoPostTableViewCell: UITableViewCell { 
    @IBOutlet weak var postingUserImageButton: UIButton! 
    @IBOutlet weak var postingUserNameButton: UIButton! 
    @IBOutlet weak var timeStampLabel: UILabel! 
    @IBOutlet weak var primaryImageView: UIImageView! 
    @IBOutlet weak var postContentsLabel: UILabel! 
    @IBOutlet weak var rippleLikesLabel: UILabel! 
    @IBOutlet weak var rippleButton: UIButton! 

    @IBOutlet weak var imageViewHeightConstraint: NSLayoutConstraint! 
    ... 
} 

このポストは持つことを必要とします以下:

postingUserIDIntカスタムユーザークラスを参照すると、ユーザーのイメージとユーザー名(左上隅)ポストのプライマリイメージを保持するタイプUIImage

photo

タイプ String

postTimeStampポストをタイプInt

rippleLikes投稿された時間をキャプチャします投稿が持つ「好き」の数を保持する。このポストは、このポストはまたpostContentLabel

という名前オプションStringを持っている私は、様々な異なるアプローチを試してみましたが、思えてきた他の場所

参照することができるように、このタイプInt0

postIDに初期化されます常にエラーに終わるので、私はいくつかのアドバイスを求めると思った。次のように

私の質問は:このクラスを定義し、作成するための最も専門的/効率的な方法は何ですか

/それぞれのテーブルビューのデリゲートメソッド内からこのテーブルビューセルクラスを初期化する

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { ... }

答えて

1

私は、セルが表すエンティティを格納するプロパティを持つことが好きです。

class PhotoPostTableViewCell: UITableViewCell { 

    // MARK: Outlets 

    @IBOutlet weak var postContentLabel: UILabel? 
    @IBOutlet weak var postPhotoImageView: UIImageView? 
    @IBOutlet weak var postTimestampLabel: UILabel? 
    @IBOutlet weak var rippleLikesLabel: UILabel? 
    @IBOutlet weak var userImageView: UIImageView? 
    @IBOutlet weak var userNameLabel: UILabel? 

    // MARK: Properties 

    var photoPost: PhotoPost? { 
     didSet { 
      // configure your outlets here 
      // e.g. postContentLabel.text = photoPost?.content 
     } 
    } 
} 

あなたはセル自体にcellForItemAtIndexPathから出口構成コードを移動し、ちょうどセルのphotoPostプロパティを設定することができます。

override func viewDidLoad() { 

    super.viewDidLoad() 

    tableView.register(UINib(nibName: "PhotoPostTableViewCell", bundle: nil), forCellReuseIdentifier: "PhotoPostCell") 
} 

... 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCell(withIdentifier: "PhotoPostCell", for: indexPath) as! PhotoPostTableViewCell 

    cell.photoPost = photoPosts[indexPath.row] 

    return cell 
} 

あなたの写真のポストクラスには、次のようになります。

class PhotoPost { 

    // MARK: Properties 

    var contents: String? 
    var id: Int! 
    var photo: UIImage! 
    var rippleLikes: Int! 
    var timestamp: Double! 
    var userID: Int! 

    init(json: [String: Any]) { 

     self.contents = json["contents"] as? String 
     self.id = json["id"] as? Int 
     self.photo = ... 
     self.rippleLikes = json["rippleLikes"] as? Int 
     self.timestamp = json["timestamp"] as? Double 
     self.userID = json["userID"] as? Int 
    } 
} 
+0

あなたはXIBとの関連を持っていない必要な変数を定義する最善の方法について、より詳細には触れてもらえますか?つまり、PostID –

+0

私は上で説明したように、メンテナンス性と再利用性のためにコードを広める良い方法として、あなたの投稿を表すクラスを作成することをお勧めします。必要な変数とオプションの変数をここで定義することができます。 – Callam

+0

私は 'PhotoPost'のようなものの例を加えて答えを更新しました。オプションのStringを使用してオプションの投稿コンテンツを定義することができます。つまり、 'post.contents'はゼロにすることができます。技術的には、他のすべてのプロパティも可能ですが、アンラップされているので、ifステートメントを使用してそれらがゼロかどうかを確認する必要があります。 – Callam

関連する問題