2016-06-03 2 views
3

UITableViewCells 배열을 만들려고합니다. 그리고 셀을 추가하기 전에 매개 변수를 사용하여 초기화해야합니다. 셀을 초기화하려고하면 클래스의 두 속성이 정의되지 않았다는 오류가 발생합니다. 그러나 내가 정의한 후에 변수가 초기화되기 전에 사용되었다는 오류가 발생합니다. 다음은 클래스매개 변수를 사용하여 사용자 지정 UITableViewCell 초기화

class SimpleCellClassTableViewCell: UITableViewCell { 

@IBOutlet var artist: UILabel! 
@IBOutlet var picture: UIImageView! 
@IBOutlet var songTitle: UILabel! 
@IBOutlet var sender: UILabel! 
var audioFile: AnyObject? = nil 
var mediaType: songType! = nil 
var id: NSNumber! = nil 

override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
    super.init(style: style, reuseIdentifier: reuseIdentifier) 
} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
} 


func configureCell(Title title: NSString?, 
         File audioFile: AnyObject?, 
         Type mediaType: songType, 
          Artist artist: NSString?, 
          Image image: UIImage?, 
          Sender sender: NSString?, 
            ID id: NSNumber?) -> UITableViewCell { 

    self.audioFile = audioFile 
    self.mediaType = mediaType 

    if let newSender = sender{ 
     self.sender.text = newSender as String 
    } 

    if let newTitle = title{ 
     self.songTitle.text = newTitle as String 

    } 

    if let newImage = image { 
     self.picture.image = newImage 
    } 

    if let newArtist = artist { 
     self.artist.text = newArtist as String 
    } 

    if let newId = id { 
     self.id = newId as NSNumber 

    } 

    return self 
} 


override func awakeFromNib() { 
    super.awakeFromNib() 
    // Initialization code 
} 

입니다 그리고 이것은 임 초기화 한 후 구성 세포의 방법으로 값을 추가하려고 곳이다 :

let newSongCell = SimpleCellClassTableViewCell.init(style: .Default, reuseIdentifier: "SimpleCell") 

     newSongCell.configureCell(Title: setTitle, 
            File: setAudioFile, 
            Type: setMediaType, 
           Artist: setArtist, 
            Image: setImage, 
           Sender: setSender, 
            ID: setId) 

파일 및 형식의 매개 변수가 동일한 오류를 던지는 사람입니다 . 또한 NSCoder에서 이니셜 라이저를 사용해야하는 경우 인수로 넣어야하는 것은 무엇입니까?

+0

var mediaType : songType! = nil //이 코드 줄을 확인하십시오. 으로 변경하십시오. var mediaType : songType? = nil – Bharath

답변

1

audioFilemediaType 속성이 잘못 정의 된 경우 표시되지 않습니다. 오류가 없어야합니다. .xib 파일을 사용하는 경우 일반적으로 명시 적 초기화 프로그램을 사용하면 안됩니다. 그리고 당신이 콘센트를 사용하기 때문에 당신이 당신의 경우에는 이것을해서는 안됩니다. init(style:reuseIdentifier:)을 사용하면 .xib 파일과 모든 UI가 누락됩니다. .xib 파일 이름이 SimpleCellClassTableViewCell.xib이고 Identity Inspector의 UITableViewCell에 대한 사용자 지정 클래스가 SimpleCellClassTableViewCell으로 설정되고 재사용 식별자가 "SimpleCell"로 설정되어 있다고 가정합니다. 나는 당신이 당신의 셀을 초기화하는 코드를 사용 제공 :

guard let newSongCell = UINib(nibName: "SimpleCellClassTableViewCell", bundle: nil).instantiateWithOwner(nil, options: nil).first as? SimpleCellClassTableViewCell 
else 
{ 
    fatalError("Error loading SimpleCellClassTableViewCell") 
} 

보통 사용자가 명시 적으로 NSCoder으로 초기화를 사용하지 말아야합니다. 이 초기화 프로그램은 스토리 보드 또는 .nib 파일에서 사용됩니다.

마지막으로 스토리 보드에서 콘센트를 사용하는 경우 모든 이니셜 라이저로 셀 인스턴스를 가져 오려고하면 안됩니다. UITableViewdequeueReusableCellWithIdentifier(forIndexPath:) 메소드를 사용해야합니다.

귀하의 직접적인 질문에 대한 대답은 모두 이지만입니다. 사실 직접 UITableViewCell을 초기화 할 필요는 거의 없습니다. 그렇게한다면, 아마 당신은 뭔가 잘못한 행동을 할 것입니다. 당신이 .xib 파일을 사용하는 것이 다음, 대부분의 경우 단순히 테이블 뷰 컨트롤러 다음

tableView.registerNib(UINib(nibName: "SimpleCellClassTableViewCell", bundle: nil), forCellReuseIdentifier: "SimpleCell") 

과의 viewDidLoad에 파일을 등록, 다시 가정 당신의 tableView 초기화하거나 dequeueReusableCellWithIdentifier(forIndexPath:) 방법으로 당신을 위해 SimpleCellClassTableViewCell 인스턴스를 다시 사용합니다

1

코드에 몇 가지 문제가 있습니다. UITableView의 몇 가지 예를 살펴 보시기 바랍니다. 애플 워드 프로세서 또는 github이 좋은 소스입니다.

문제 # 1

당신은 당신이 재정에서 아무것도하지 않고 있기 때문에 (아래) 지정된`있는 UITableViewCell의 초기화를 오버라이드 (override) 할 필요가 없습니다.

public init(style: UITableViewCellStyle, reuseIdentifier: String?) 
public init?(coder aDecoder: NSCoder) 

문제 # 2

코드는 하지 나쁜 세포 개체를 재사용한다.

스위프트 init에서

통화 사이트에서 사용하지 않는 3 호 번호, 그래서 셀의 초기화 코드 (도 고려는 # 2 월호)해야

var simpleCell = tableView.dequeueReusableCellWithIdentifier("SimpleCell") 
if simpleCell == nil { 
    let cell: SimpleCellClassTableViewCell = SimpleCellClassTableViewCell(style: .Default, reuseIdentifier: "SimpleCell") 
    cell.configureCell(Title: "test", 
         File: "", 
         Type: 2, 
         Artist: "test", 
         Image: UIImage(), 
         Sender: "test", 
          ID: 2) 
    simpleCell = cell 
} 
return simpleCell! 

문제 # 4

대문자로 된 첫 번째 문자 (Title, File 등)가있는 함수 매개 변수의 이름을 지정하지 마십시오. . 이것은 유형과 혼동 될 수 있습니다. 대신 title, file 등을 사용하십시오. 다시, 많은 예제가 있습니다.

이 문제를 해결하십시오. 이 일 수도 있고 도움이됩니다.

관련 문제