아래에서 교환한 후, Swift는 TableView를 다시 불러오고, Parse에서 데이터를 업데이트합니다. (Swift, Xcode 6beta 5, Parse, UItableView)
A. 개요
(위의gif에서는Parse에서 새로운 데이터를 등록한 후에 업데이트를 하고 등록된 데이터가 반영된 애니메이션이 있는지 확인합니다.)
B. 환경
C. Github
1. Parse에서 데이터를 읽는 함수 만들기 class TimelineTableViewController: UITableViewController {
var timelineData:NSMutableArray = NSMutableArray()
required init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder)
}
func loadData(){
timelineData.removeAllObjects()
// call databases
var findTimelineData:PFQuery = PFQuery(className: "Tweets")
findTimelineData.findObjectsInBackgroundWithBlock{
(objects:[AnyObject]!, error:NSError!)->Void in
if !error{
for object in objects{
self.timelineData.addObject(object)
}
let array:NSArray = self.timelineData.reverseObjectEnumerator().allObjects
self.timelineData = array as NSMutableArray
self.tableView.reloadData()
}
}
}
override func viewDidAppear(animated: Bool) {
// Controller読み込み時にデータを取得。これは「下に引っ張って更新」とは関係無い。
self.loadData()
...
}
2. "드롭다운 업데이트" 섹션 만들기
timelineTableViewController.swiftoverride func viewDidLoad() {
super.viewDidLoad()
// 下記を追加
var refresh = UIRefreshControl()
refresh.attributedTitle = NSAttributedString(string: "Loading...") // Loading中に表示する文字を決める
refresh.addTarget(self, action: "pullToRefresh", forControlEvents:.ValueChanged)
self.refreshControl = refresh
}
// 何を更新するのかを定義
func pullToRefresh(){
self.loadData() // 先ほど1で書いたParseからデータを取る関数を呼び出す
refreshControl.endRefreshing() // データが取れたら更新を終える(くるくる回るViewを消去)
self.tableView.reloadData() // tableView自身を再読み込み
println("reload finised")
}
class TimelineTableViewController: UITableViewController {
var timelineData:NSMutableArray = NSMutableArray()
required init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder)
}
func loadData(){
timelineData.removeAllObjects()
// call databases
var findTimelineData:PFQuery = PFQuery(className: "Tweets")
findTimelineData.findObjectsInBackgroundWithBlock{
(objects:[AnyObject]!, error:NSError!)->Void in
if !error{
for object in objects{
self.timelineData.addObject(object)
}
let array:NSArray = self.timelineData.reverseObjectEnumerator().allObjects
self.timelineData = array as NSMutableArray
self.tableView.reloadData()
}
}
}
override func viewDidAppear(animated: Bool) {
// Controller読み込み時にデータを取得。これは「下に引っ張って更新」とは関係無い。
self.loadData()
...
}
timelineTableViewController.swift
override func viewDidLoad() {
super.viewDidLoad()
// 下記を追加
var refresh = UIRefreshControl()
refresh.attributedTitle = NSAttributedString(string: "Loading...") // Loading中に表示する文字を決める
refresh.addTarget(self, action: "pullToRefresh", forControlEvents:.ValueChanged)
self.refreshControl = refresh
}
// 何を更新するのかを定義
func pullToRefresh(){
self.loadData() // 先ほど1で書いたParseからデータを取る関数を呼び出す
refreshControl.endRefreshing() // データが取れたら更新を終える(くるくる回るViewを消去)
self.tableView.reloadData() // tableView自身を再読み込み
println("reload finised")
}
self.tableView.reloadData()
를 쓰지 않으면 데이터를 고치기 전에 Loading의 View가 사라지고 붕괴됩니다.3. tableView와 연결된 기타 코드
timelineTableViewController.swift
override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete method implementation.
// Return the number of rows in the section.
// データの数だけrowを返す
return timelineData.count
}
override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
let cell:TweetTableViewCell = tableView!.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as TweetTableViewCell
let tweet:PFObject = self.timelineData.objectAtIndex(indexPath!.row) as PFObject
// デザイン部分
cell.tweetTextView.alpha = 0
cell.timestampLabel.alpha = 0
cell.usernameLabel.alpha = 0
// Tweetの内容をParse.comから取得
cell.tweetTextView.text = tweet.objectForKey("content") as String
var dataFormatter:NSDateFormatter = NSDateFormatter()
dataFormatter.dateFormat = "yyyy-MM-dd HH:mm"
cell.timestampLabel.text = dataFormatter.stringFromDate(tweet.createdAt)
// objectIdをforeignKeyとして、user(tweeter)を取得
var findTweeter:PFQuery = PFUser.query()
findTweeter.whereKey("objectId", equalTo: tweet.objectForKey("tweeter").objectId)
findTweeter.findObjectsInBackgroundWithBlock{
(objects:[AnyObject]!, error:NSError!)->Void in
if !error{
let user:PFUser = (objects as NSArray).lastObject as PFUser
cell.usernameLabel.text = "@\(user.username)"
// CELLの表示を少しずつずらす
UIView.animateWithDuration(0.5, animations: {
cell.tweetTextView.alpha = 1
cell.timestampLabel.alpha = 1
cell.usernameLabel.alpha = 1
})
}
}
// Configure the cell...
return cell
}
4. Navigation bar에 업데이트 버튼 추가
override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete method implementation.
// Return the number of rows in the section.
// データの数だけrowを返す
return timelineData.count
}
override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
let cell:TweetTableViewCell = tableView!.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as TweetTableViewCell
let tweet:PFObject = self.timelineData.objectAtIndex(indexPath!.row) as PFObject
// デザイン部分
cell.tweetTextView.alpha = 0
cell.timestampLabel.alpha = 0
cell.usernameLabel.alpha = 0
// Tweetの内容をParse.comから取得
cell.tweetTextView.text = tweet.objectForKey("content") as String
var dataFormatter:NSDateFormatter = NSDateFormatter()
dataFormatter.dateFormat = "yyyy-MM-dd HH:mm"
cell.timestampLabel.text = dataFormatter.stringFromDate(tweet.createdAt)
// objectIdをforeignKeyとして、user(tweeter)を取得
var findTweeter:PFQuery = PFUser.query()
findTweeter.whereKey("objectId", equalTo: tweet.objectForKey("tweeter").objectId)
findTweeter.findObjectsInBackgroundWithBlock{
(objects:[AnyObject]!, error:NSError!)->Void in
if !error{
let user:PFUser = (objects as NSArray).lastObject as PFUser
cell.usernameLabel.text = "@\(user.username)"
// CELLの表示を少しずつずらす
UIView.animateWithDuration(0.5, animations: {
cell.tweetTextView.alpha = 1
cell.timestampLabel.alpha = 1
cell.usernameLabel.alpha = 1
})
}
}
// Configure the cell...
return cell
}
@IBAction func loadData(){ // ココを追加する
timelineData.removeAllObjects()
// call databases
var findTimelineData:PFQuery = PFQuery(className: "Tweets")
findTimelineData.findObjectsInBackgroundWithBlock{
(objects:[AnyObject]!, error:NSError!)->Void in
if !error{
for object in objects{
self.timelineData.addObject(object)
}
let array:NSArray = self.timelineData.reverseObjectEnumerator().allObjects
self.timelineData = array as NSMutableArray
self.tableView.reloadData()
}
}
}
D. 관련 보도
Reference
이 문제에 관하여(아래에서 교환한 후, Swift는 TableView를 다시 불러오고, Parse에서 데이터를 업데이트합니다. (Swift, Xcode 6beta 5, Parse, UItableView)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kiiita/items/dd3f3ffc3176031bf18d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)