___|  _ \   |  |    |   |_ _|\ \     / ____|
 |     |   |  |  |    |   |  |  \ \   /  __|
 |   | |   | ___ __|  ___ |  |   \ \ /   |
\____|\___/     _|   _|  _|___|   \_/   _____| 

 --- A GOPHER-LIKE INTERFACE FOR HIVE BLOCKCHAIN ---

Develop the iOS App using the Swift - Part #3

BY: @steemthinkcom | CREATED: March 13, 2018, 9:37 a.m. | VOTES: 5 | PAYOUT: $0.04 | [ VOTE ]

New Features

Encapsulate functionView

Given the frequent use of functionView in projects, in order to simplify the amount of code in the project, we simply encapsulated functionView.

[IMAGE: https://res.cloudinary.com/hpiynhbhq/image/upload/v1520932363/axawuvodptigifgr7qsh.png]

This is it.

Before, we put all the buttons in the same xib file.
[IMAGE: https://res.cloudinary.com/hpiynhbhq/image/upload/v1520932458/jwadojmlansxnrjkjhcl.png]

This will not be able to deal with multiple different scenarios.

So we use each button as a separate class: STMainFunctionItem

func setSubViews(title:String,imageName:String) {
        self.setSubViews(title: title, imageName: imageName, target: nil, selector: nil)
    }    
func setSubViews(title:String,imageName:String,target:Any?,selector:Selector?) {
        titleLab.text = title
        DesImgV.image = UIImage.init(named: imageName)
        self.selector = selector
        self.target = target
}

Created by the above two initialization methods.

In the STMainCellFunctionView class, load each item as follows.

Control each item constraint through the snap framework.

func setFunctionItem(items:[STMainFunctionItem]) {
        self.items = items
        // Add view
        for item in items {
            self.addSubview(item)
        }        
        // Add constraints
        for (idx, item) in items.enumerated() {
            item.snp.makeConstraints({ (make) in
                // left
                if idx == 0{
                    make.left.equalTo(self.snp.left).offset(0)
                }else{
                    make.left.equalTo(items[idx - 1].snp.right).offset(0)
                    //width
                    make.width.equalTo(items[idx - 1].snp.width)
                }                
                // right
                if idx == items.count - 1 {
                    make.right.equalTo(self.snp.right).offset(0)
                }else{
                    make.right.equalTo(items[idx + 1].snp.left).offset(0)
                }                
                // top
                make.top.equalTo(self.snp.top).offset(0)
                // bottom
                make.bottom.equalTo(self.snp.bottom).offset(0)
            })
        }
    }

This revision mainly involves the following documents

//
//  STMainCellFunctionView.swift
//  SteemThink
//
//  Created by zhouzhiwei on 2018/2/26.
//  Copyright © 2018年 zijinph. All rights reserved.
//

import UIKit

class STMainFunctionItem: UIView {

    lazy var DesImgV: UIImageView = {
        let imgV = UIImageView()
        return imgV
    }()
    lazy var titleLab: UILabel = {
        let lab = UILabel()
        lab.textColor = colorWithHex(hex: 0x707070)
        lab.font = kfont(size: 13.0)
        return lab
    }()

    lazy var activity:UIActivityIndicatorView = {
        let activity = UIActivityIndicatorView.init(activityIndicatorStyle: UIActivityIndicatorViewStyle.gray)
        activity.color = kAppMainColor
        activity.hidesWhenStopped = true
        activity.isHidden = true
        return activity
    }()

    var selector:Selector?
    var target:Any?

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.setUpSubViews()

        // 添加单机手势
        let tap = UITapGestureRecognizer.init(target: self, action: #selector(itemTap))
        self.addGestureRecognizer(tap)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func updateConstraints() {
        super.updateConstraints()
        // 添加约束
        self.titleLab.snp.makeConstraints({ (make) in
            make.centerY.equalTo(self.snp.centerY)
            make.centerX.equalTo(self.snp.centerX).offset(13)
        })
        self.DesImgV.snp.makeConstraints({ (make) in
            make.width.equalTo(25.0)
            make.height.equalTo(25.0)
            make.centerY.equalTo(self.snp.centerY)
            make.right.equalTo(self.titleLab.snp.left).offset(-5.0)
        })
        self.activity.snp.makeConstraints { (make) in
            make.left.equalTo(self.titleLab.snp.right).offset(10.0)
            make.centerY.equalTo(self.snp.centerY)
        }
    }

    func setUpSubViews() {
        self.addSubview(self.titleLab)
        self.addSubview(self.DesImgV)
        self.addSubview(self.activity)
        self.updateConstraints()
    }    
    func setSubViews(title:String,imageName:String) {
        self.setSubViews(title: title, imageName: imageName, target: nil, selector: nil)
    }    
    func setSubViews(title:String,imageName:String,target:Any?,selector:Selector?) {
        titleLab.text = title
        DesImgV.image = UIImage.init(named: imageName)
        self.selector = selector
        self.target = target
    }    
    //MARK: - 菊花动画
    func showActivityAnimate(isAnimate:Bool) {
        if isAnimate {
            self.activity.startAnimating()
        }else{
            self.activity.stopAnimating()
        }
    }

    //MARK: - 单机手势
    @objc func itemTap() {
        if self.target != nil && self.selector != nil {
            (self.target! as AnyObject).perform(self.selector!, with: nil, afterDelay: 0.0)
        }
    }
}
class STMainCellFunctionView: UIView {    
    var items:[STMainFunctionItem]?    
    func setFunctionItem(items:[STMainFunctionItem]) {
                self.items = items
        // 添加视图
        for item in items {
            self.addSubview(item)
        }

        // 添加约束
        for (idx, item) in items.enumerated() {
            item.snp.makeConstraints({ (make) in
                // left
                if idx == 0{
                    make.left.equalTo(self.snp.left).offset(0)
                }else{
                    make.left.equalTo(items[idx - 1].snp.right).offset(0)
                    //width
                    make.width.equalTo(items[idx - 1].snp.width)
                }

                // right
                if idx == items.count - 1 {
                    make.right.equalTo(self.snp.right).offset(0)
                }else{
                    make.right.equalTo(items[idx + 1].snp.left).offset(0)
                }

                // top
                make.top.equalTo(self.snp.top).offset(0)
                // bottom
                make.bottom.equalTo(self.snp.bottom).offset(0)
            })
        }
    }
}
//
//  STMainTableViewCell.swift
//  SteemThink
//
//  Created by zhouzhiwei on 2018/2/24.
//  Copyright © 2018年 zijinph. All rights reserved.
//

import UIKit
import SDWebImage

class STMainTableViewCell: STBaseTableViewCell {

    @IBOutlet weak var userIconImgV: UIImageView!
    @IBOutlet weak var nameLab: UILabel!
    @IBOutlet weak var timeLab: UILabel!
    @IBOutlet weak var titleLab: UILabel!
    @IBOutlet weak var contentLab: UILabel!
    @IBOutlet weak var functionView: STMainCellFunctionView!

    var favor:Bool = false
    var indexPath:IndexPath?

    var content:STContent?{
        didSet{

            // 重置点赞
            favor = false

            // 姓名(Name)
            nameLab.text = content?.author

            // 日期 (Date)
            timeLab.text = NSDate_STExtension.getDateLong(fromDate: (content?.last_update)!)

            // 标题 (Title)
            titleLab.text = content?.root_title

            // 内容 (Content)
            contentLab.text = content?.body

            // 头像 (通过authorName 获取个人信息列表)(UserIcon)
            let url = "https://steemitimages.com/u/"+(content?.author)!+"/avatar"
            self.userIconImgV.sd_setImage(with: URL.init(string: url), placeholderImage: UIImage.init(named: "user_icon_placeholder"), completed: nil)

            self.setFunctionData(content: content)
        }
    }

    var searchResult:STSearchResult?{
        didSet{
            // 姓名(Name)
            nameLab.text = searchResult?.author

            // 日期 (Date)
            timeLab.text = NSDate_STExtension.getDateLong(fromDate: (searchResult?.created)!)

            // 标题 (Title)
            titleLab.text = searchResult?.title

            // 内容 (Content)
            contentLab.text = searchResult?.summary

            // 头像 (通过authorName 获取个人信息列表)(UserIcon)
            let url = "https://steemitimages.com/u/"+(searchResult?.author)!+"/avatar"
            self.userIconImgV.sd_setImage(with: URL.init(string: url), placeholderImage: UIImage.init(named: "user_icon_placeholder"), completed: nil)

//            functionView.content = content
//            functionView.delegate = self
        }
    }


    override func awakeFromNib() {
        super.awakeFromNib()
        self.setUpFunctionView()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }

    func setUpFunctionView() {
        functionView.setFunctionItem(items: [STMainFunctionItem(),STMainFunctionItem(),STMainFunctionItem()])
    }

    // MARK: - 填充function数据
    func setFunctionData(content:STContent?) {
        let sbd = content?.pending_payout_value.components(separatedBy: " ").first
        let dolerStr = " " + "\(String(describing: sbd!))"
        let item1 = functionView.items![0]
        item1.setSubViews(title: dolerStr, imageName: "main_doller")

        let commentStr = String(format: "%d",(content?.children)!)
        let item2 = functionView.items![1]
        item2.setSubViews(title: commentStr, imageName: "main_comment")

        let voteStr = String(format: "%d",(content?.active_votes_arr?.count)!)
        let item3 = functionView.items![2]
        item3.showActivityAnimate(isAnimate: (content?.loading)!)

        if UserDataManager.sharedInstance.isLogin() {
            for vote in (content?.active_votes_arr)! {
                if vote.voter == UserDataManager.sharedInstance.getUserName(){
                    favor = true
                    break
                }
            }
        }
        let imageName = favor ? "main_vote":"main_unvote"
        item3.setSubViews(title: voteStr, imageName: imageName, target: self, selector: #selector(voteViewOnTap))
    }

    //MARK: - Vote
    @objc func voteViewOnTap() {
        if !self.favor {

            content?.loading = true
            functionView.items![2].showActivityAnimate(isAnimate: true)
            let idx = self.indexPath
            STClient.vote(voter: UserDataManager.sharedInstance.getUserName(), author: content!.author, permlink: content!.permlink, weight: 10000, to:nil) { (response, error) in
                self.content?.loading = false
                self.functionView.items![2].showActivityAnimate(isAnimate: false)
                if error == nil && idx == self.indexPath{
                    self.voteAnimate()
                }
            }
        }
    }

    //MARK: - Animate
    func voteAnimate() {

        // 如果已经点赞忽略
        if self.favor {
            return
        }

        // 插入点赞的模型(本人点赞)
        let mineVote = STContentActiveVotes()
        mineVote.voter = UserDataManager.sharedInstance.getUserName()
        self.content?.active_votes_arr?.append(mineVote)

        // 刷新点赞个数
        let item3 = functionView.items![2]
        item3.titleLab.text = String(format: "%d",(content?.active_votes_arr?.count)!)

        // 点赞动画
        UIView.animate(withDuration: 0.3, animations: {
            let newTransform = CGAffineTransform.init(scaleX: 1.2, y: 1.2)
            item3.DesImgV.transform = newTransform
            item3.DesImgV.alpha = 0.5
        }) { (finished) in
//            if self.favor {
//                self.voteImgV.image = UIImage.init(named: "main_unvote")
//            }else{
                item3.DesImgV.image = UIImage.init(named: "main_vote")
//            }

            self.favor = !self.favor

            UIView.animate(withDuration: 0.3, animations: {
                item3.DesImgV.transform = CGAffineTransform.identity
                item3.DesImgV.alpha = 1
            })
        }
    }
}
//
//  STContentDetailTableViewCell.swift
//  SteemThink
//
//  Created by zhouzhiwei on 2018/2/28.
//  Copyright © 2018年 zijinph. All rights reserved.
//
import UIKit

class STContentDetailTableViewCell: STBaseTableViewCell {

    @IBOutlet weak var userIconImgV: UIImageView!
    @IBOutlet weak var nameLab: UILabel!
    @IBOutlet weak var timeLab: UILabel!
    @IBOutlet weak var contentLab: UILabel!
    @IBOutlet weak var functionView: STMainCellFunctionView!

    var favor:Bool = false
    var indexPath:IndexPath?
    var comment:STComment?{
        didSet{

            // 重置点赞
            favor = false

            // 姓名(Name)
            nameLab.text = comment?.author

            // 日期 (Date)
//            let timeStr = comment?.created.replacingOccurrences(of: "T", with: " ")
            timeLab.text = NSDate_STExtension.getDateLong(fromDate: (comment?.created)!)

            // 内容 (Content)
            contentLab.text = comment?.body

            // 头像 (通过authorName 获取个人信息列表)(UserIcon)
            let url = "https://steemitimages.com/u/"+(comment?.author)!+"/avatar"
            self.userIconImgV.sd_setImage(with: URL.init(string: url), placeholderImage: UIImage.init(named: "user_icon_placeholder"), completed: nil)

//            let sbd = comment?.pending_payout_value.components(separatedBy: " ").first
//            functionView.dollarLab.text = " " + "\(String(describing: sbd!))"
//            functionView.voteLab.text = String(format: "%d",(comment?.active_votes_arr?.count)!)
//            functionView.commentLab.text = String(format: "%d",(comment?.children)!)
            self.setFunctionData(comment: comment!)
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        self.setUpFunctionView()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }

    func setUpFunctionView() {
        functionView.setFunctionItem(items: [STMainFunctionItem(),STMainFunctionItem()])
    }

    // MARK: - 填充function数据
    func setFunctionData(comment:STComment?) {
        let sbd = comment?.pending_payout_value.components(separatedBy: " ").first
        let dolerStr = " " + "\(String(describing: sbd!))"
        let item1 = functionView.items![0]
        item1.setSubViews(title: dolerStr, imageName: "main_doller")

//        let commentStr = String(format: "%d",(content?.children)!)
//        let item2 = functionView.items![1]
//        item2.setSubViews(title: commentStr, imageName: "main_comment")

        let voteStr = String(format: "%d",(comment?.active_votes_arr?.count)!)
        let item2 = functionView.items![1]

        if UserDataManager.sharedInstance.isLogin() {
            for vote in (comment?.active_votes_arr)! {
                if vote.voter == UserDataManager.sharedInstance.getUserName(){
                    favor = true
                    break
                }
            }
        }
        let imageName = favor ? "main_vote":"main_unvote"
        item2.setSubViews(title: voteStr, imageName: imageName, target: self, selector: #selector(voteViewOnTap))
    }

    //MARK: - Vote
    @objc func voteViewOnTap() {
        if self.favor {
            let window = UIApplication.shared.keyWindow
            let idx = self.indexPath
            STClient.vote(voter: UserDataManager.sharedInstance.getUserName(), author: comment!.author, permlink: comment!.permlink, weight: 10000, to:window) { (response, error) in
                if error != nil && idx == self.indexPath{
                    self.voteAnimate()
                }
            }
        }
    }

    //MARK: - Animate
    func voteAnimate() {

        // 如果已经点赞忽略
        if self.favor {
            return
        }

        // 插入点赞的模型(本人点赞)
        let mineVote = STContentActiveVotes()
        mineVote.voter = UserDataManager.sharedInstance.getUserName()
        self.comment?.active_votes_arr?.append(mineVote)

        // 刷新点赞个数
        let item3 = functionView.items![1]
        item3.titleLab.text = String(format: "%d",(comment?.active_votes_arr?.count)!)

        // 点赞动画
        UIView.animate(withDuration: 0.3, animations: {
            let newTransform = CGAffineTransform.init(scaleX: 1.2, y: 1.2)
            item3.DesImgV.transform = newTransform
            item3.DesImgV.alpha = 0.5
        }) { (finished) in
            //            if self.favor {
            //                self.voteImgV.image = UIImage.init(named: "main_unvote")
            //            }else{
            item3.DesImgV.image = UIImage.init(named: "main_vote")
            //            }

            self.favor = !self.favor

            UIView.animate(withDuration: 0.3, animations: {
                item3.DesImgV.transform = CGAffineTransform.identity
                item3.DesImgV.alpha = 1
            })
        }
    }  
}
//
//  ViewController.swift
//  SteemThink
//
//  Created by zhouzhiwei on 2018/2/12.
//  Copyright © 2018年 zijinph. All rights reserved.
//
import UIKit
import MJRefresh

enum MainRequestType: Int {
    case New = 0
    case Hot = 1
    case Trending = 2
}

class STMainViewController: UITableViewController{

    lazy var dataSource:[STContent] = {
        let source:[STContent] = []
        return source
    }()
    var requestType:MainRequestType?

    override func viewDidLoad() {
        super.viewDidLoad()
        self.setUpTableView()
//        self.loadData()
    }

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

    //MARK: - 初始化
    class func initWith(requestType:MainRequestType) -> STMainViewController {
        let VC = STMainViewController.init()
        VC.requestType = requestType
        return VC
    }

    //MARK: - 初始化TableView
    func setUpTableView() -> Void {
        self.tableView.tableFooterView = UIView.init()
        self.tableView.register(UINib.init(nibName:String(describing: type(of:STMainTableViewCell())), bundle: Bundle.main), forCellReuseIdentifier: STMainTableViewCell.cellIdentifier())
        self.tableView.estimatedRowHeight = 218
        self.tableView.separatorInset = UIEdgeInsetsMake(0, 12, 0, 12)

        self.tableView.mj_header = MJDIYHeader.init(refreshingBlock: {
            self.loadData()
        })
        self.tableView.mj_footer = MJRefreshAutoFooter.init(refreshingBlock: {
        })
        self.tableView.mj_header.beginRefreshing()
    }

    //MARK: - 获取数据
    func loadData() -> Void {
        let dict = ["tag":"life", "limit": "50"]
        let jsonStr = NSDictionary_STExtension.getJSONStringFromDictionary(dictionary: dict)

        // 根据枚举类型选择URL
        var urlH:String?
        switch self.requestType! {
        case .New:
            urlH = discussions_by_created;
            break
        case .Hot:
            urlH = discussions_by_hot
            break
        case .Trending:
            urlH = discussions_by_trending
            break
        }
        let url = urlH! + "query=" + jsonStr.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!

        STClient.get(url: url, parameters: nil, to: nil) { (response: Any?,error: Error?) in

            self.tableView.mj_header.endRefreshing()
            self.tableView.mj_footer.endRefreshingWithNoMoreData()

            if !(error != nil) {
                if response is NSArray{
                    let arr3:NSArray = response as! NSArray
                    for dict3:Dictionary in arr3 as! [Dictionary]{
                        // 遍历得到Model
                        let trending = STContent.init(dict: dict3)
                        self.dataSource.append(trending)
                    }
                }
                self.tableView.reloadData()
            }
        }
    }

    // MARK: - TableViewDelegate & TableViewDataSource
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.dataSource.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell:STMainTableViewCell = tableView.dequeueReusableCell(withIdentifier: STMainTableViewCell.cellIdentifier(), for: indexPath) as! STMainTableViewCell
        cell.content = self.dataSource[indexPath.row]
        cell.indexPath = indexPath
        return cell
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        let content = self.dataSource[indexPath.row]
        let VC:STContentDetailViewController = UIStoryboard.init(name: "STBodyStoryboard", bundle: Bundle.main).instantiateViewController(withIdentifier: String(describing: STContentDetailViewController.classForCoder())) as! STContentDetailViewController
        VC.content = content
        VC.hidesBottomBarWhenPushed = true;
        self.navigationController?.pushViewController(VC, animated: true)
    }
}
//
//  STContentDetailViewController.swift
//  SteemThink
//
//  Created by zhouzhiwei on 2018/2/28.
//  Copyright © 2018年 zijinph. All rights reserved.
//
import UIKit
import IQKeyboardManager

let bootomEdge:CGFloat = 45.0

class STContentDetailViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!
    var content:STContent?
    lazy var dataSource:[STComment] = {
        let source:[STComment] = []
        return source
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = localizedString(key: "Content", comment: "")
        self.setUpTableView()
        self.setUpInputView()
//        self.loadData()
    }

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

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        IQKeyboardManager.shared().isEnabled = false
    }

    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        IQKeyboardManager.shared().isEnabled = true
    }


    func setUpTableView() -> Void {
        self.tableView.register(UINib.init(nibName: String(describing: STContentDetailTableViewCell.classForCoder()), bundle: Bundle.main), forCellReuseIdentifier: STContentDetailTableViewCell.cellIdentifier())

        let contentHeaderView:STContentHeaderView = Bundle.main.loadNibNamed(String(describing: STContentHeaderView.classForCoder()), owner: self, options: nil)?.first as! STContentHeaderView
        contentHeaderView.content = self.content
        contentHeaderView.reloadFrame()
        self.tableView.tableHeaderView = contentHeaderView
        self.tableView.tableFooterView = UIView()
        let edge = self.tableView.contentInset
        self.tableView.contentInset = UIEdgeInsetsMake(edge.top, edge.left, bootomEdge, edge.right)
        self.tableView.mj_header =  MJDIYHeader.init(refreshingBlock: {
            self.loadData()
        })
        self.tableView.mj_header.beginRefreshing()
    }

    func setUpInputView() {
        let inputView = STCommentInputView.init(frame: CGRect.init(x: 0, y: screen_height - bootomEdge, width: screen_width, height: bootomEdge)) {[weak self] (text) in
            self?.sencComment(text: text)
        }
        self.view.addSubview(inputView)
    }

    func setFooterView(isShow:Bool) -> Void {
        if isShow {
            let contentFooterView:STContentNoDataFooterView = Bundle.main.loadNibNamed(String(describing: STContentNoDataFooterView.classForCoder()), owner: self, options: nil)?.first as! STContentNoDataFooterView
            contentFooterView.detailLab.text = localizedString(key: "No Comment", comment: "")
            self.tableView.tableFooterView = contentFooterView;
        }else{
            self.tableView.tableFooterView = UIView()
        }
    }

    func loadData() -> Void {
        let url = get_content_replies + "author=" + (content?.author)! + "&permlink=" + (content?.permlink)!
        STClient.get(url: url, parameters: nil, to: nil) { (response: Any?,error: Error?) in
            self.tableView.mj_header.endRefreshing()
            self.dataSource.removeAll()
            if response is NSArray{
                let dicArr:NSArray = response as! NSArray

                if dicArr.count == 0 {
                    // 显示占位图
                    self.setFooterView(isShow: true)
                    return;
                }
                // 不显示占位图
                self.setFooterView(isShow: false)

                for dic:Dictionary in dicArr as! [Dictionary]{
                    // 遍历得到Model
                    let comment = STComment.init(dict: dic)
                    self.dataSource.append(comment)
                }
            }
            self.tableView.reloadData()
        }
    }

    // MARK: - TableViewDelegate & TableViewDataSource
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.dataSource.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell:STContentDetailTableViewCell = tableView.dequeueReusableCell(withIdentifier: STContentDetailTableViewCell.cellIdentifier(), for: indexPath) as! STContentDetailTableViewCell
        cell.indexPath = indexPath
        cell.comment = self.dataSource[indexPath.row]
        return cell
    }

    //MARK: - Send Comment
    func sencComment(text:String?) {

        let permlink = STFormatter.commentPermlink(parentAuthor: (content?.author)!, parentPermlink: (content?.parent_permlink)!)
        print("permlink ========" + permlink!)

        if permlink != nil {
            STClient.comment(parentAuthor: (content?.author)!, parentPermlink: (content?.permlink)!, author: UserDataManager.sharedInstance.getUserName(), permlink: permlink!, body: text!, to:self.view) { (response, error) in
                self.tableView.mj_header.beginRefreshing()
            }
        }
    }
}
//
//  STSearchViewController.swift
//  SteemThink
//
//  Created by zhouzhiwei on 2018/2/27.
//  Copyright © 2018年 zijinph. All rights reserved.
//
import UIKit
import MJRefresh

class STSearchViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UISearchBarDelegate {


    @IBOutlet weak var tableView: UITableView!
    lazy var dataSource:[STSearchResult] = {
        let source:[STSearchResult] = []
        return source
    }()

    var searchBar:UISearchBar?
    var page:Int = 1

    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationItem.title = localizedString(key: "Search", comment: "")
        self.setUpNavigationBar()
        self.setUpTableView()
    }

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

    // MARK: - UINavigationBarappend
    func setUpNavigationBar() -> Void {
        self.searchBar = UISearchBar.init(frame: CGRect.zero)
        self.searchBar?.placeholder = localizedString(key: "Search", comment: "")
        self.searchBar?.delegate = self
        self.navigationItem.titleView = searchBar

        // 导航栏放置UISearchBar 导航栏高度变高 (iOS 11)
        if #available(iOS 11.0, *) {
            self.searchBar?.heightAnchor.constraint(equalToConstant: 44.0).isActive = true
        }

        // 弹出键盘
        self.searchBar?.becomeFirstResponder()
    }


    //MARK: - 初始化TableView
    func setUpTableView() -> Void {
        self.tableView.tableFooterView = UIView()
        self.tableView.register(UINib.init(nibName:String(describing: type(of:STMainTableViewCell())), bundle: Bundle.main), forCellReuseIdentifier: STMainTableViewCell.cellIdentifier())
        self.tableView.estimatedRowHeight = 218
        self.tableView.separatorInset = UIEdgeInsetsMake(0, 12, 0, 12)

        self.tableView.mj_footer = MJDIYAutoFooter.init(refreshingBlock: {
            self.page += 1
            self.loadData(searchText: self.searchBar!.text!)
        })
    }

    //MARK: - 获取数据
    func loadData(searchText:String) {

        let url = get_search_result + "+" + searchText + "&pg=" + "\(self.page)"

        // url编码
        STClient.get(url: url.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), parameters: nil, to: nil) { (response: Any?,error: Error?) in

            self.tableView.mj_footer.endRefreshing()

            if !(error != nil) {
                let responseData = response as! Dictionary

                // 判断有无更多数据
                if responseData["pages"] != nil {
                    let page = STSeachPages.init(dict: responseData["pages"] as! [String : Any])
                    if !page.has_next {
                        self.tableView.mj_footer.endRefreshingWithNoMoreData()
                    }
                }

                // 数据装载
                if responseData["results"] is NSArray{
                    let arr:NSArray = responseData["results"] as! NSArray
                    for dict:Dictionary in arr as! [Dictionary]{
                        // 遍历得到Model
                        let searchResult = STSearchResult.init(dict: dict)
                        self.dataSource.append(searchResult)
                    }
                }
                self.tableView.reloadData()
            }
        }
    }

    // MARK: - TableViewDelegate & TableViewDataSource
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.dataSource.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell:STMainTableViewCell = tableView.dequeueReusableCell(withIdentifier: STMainTableViewCell.cellIdentifier(), for: indexPath) as! STMainTableViewCell
        cell.searchResult = self.dataSource[indexPath.row]
        cell.indexPath = indexPath
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
//        let content = self.dataSource[indexPath.row]
//        let VC:STContentDetailViewController = UIStoryboard.init(name: "STBodyStoryboard", bundle: Bundle.main).instantiateViewController(withIdentifier: String(describing: STContentDetailViewController.classForCoder())) as! STContentDetailViewController
//        VC.content = content
//        VC.hidesBottomBarWhenPushed = true;
//        self.navigationController?.pushViewController(VC, animated: true)
    }

//    func scrollViewDidScroll(_ scrollView: UIScrollView) {
//        self.searchBar?.resignFirstResponder()
//    }

    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        self.searchBar?.resignFirstResponder()
    }

    //MARK: - UISearchBarDelegate
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        self.page = 1
        self.loadData(searchText: searchBar.text!)
    }
}

Posted on Utopian.io - Rewarding Open Source Contributors

TAGS: [ #utopian-io ] [ #steemthink-dev ] [ #steemit ] [ #steemdev ] [ #dev ]

Replies

@eastmael | March 16, 2018, 3:21 a.m. | Votes: 0 | [ VOTE ]

Your contribution cannot be approved yet. See the Utopian Rules. Please edit your contribution to reapply for approval.

Can you please send a link on where we can test this?

You may edit your post here, as shown below:
[IMAGE: https://res.cloudinary.com/hpiynhbhq/image/upload/v1509788371/nbgbomithszxs3nxq6gx.png]

You can contact us on Discord.
[utopian-moderator]

@steemthinkcom | March 16, 2018, 3:42 a.m. | Votes: 0 | [ VOTE ]

Can you install ipa? If you can upload IPA to the network, I can install it for testing

@eastmael | March 16, 2018, 3:45 a.m. | Votes: 0 | [ VOTE ]

I have an iPhone. Can't this be tested using TestFlight?

@steemthinkcom | March 16, 2018, 3:51 a.m. | Votes: 0 | [ VOTE ]

yeah~
can you give me you "first name / last name / email"
I will add you as a tester

@eastmael | March 16, 2018, 3:54 a.m. | Votes: 0 | [ VOTE ]

DMed you the details in discord.

@cheetah | March 17, 2018, 2:07 a.m. | Votes: 0 | [ VOTE ]

Hi! I am a robot. I just upvoted you! I found similar content that readers might be interested in:
http://www.seemuapps.com/tutorial-custom-uitableview-cell

@eastmael | March 17, 2018, 2:18 a.m. | Votes: 1 | [ VOTE ]

Your contribution cannot be approved because it does not follow the Utopian Rules.

Hello @steemthinkcom, thank you for providing me the test link for the app. After much thought, I cannot accept this contribution for the following reasons:
1. This does not seem to be a new feature but rather a refactor of your codes. I consider code on the side of a bug - an unwanted behavior - and not as a feature. It states in the rules - Bug Fixes for contributor’s Own Projects will not be accepted, unless the Bugs were caused by third party dependencies.
1. I tried to use the app but I still cannot see the unique value in it because most of the features are not there yet. It only contains New, Hot, and Trending and I still cannot see its difference with other existing iOS apps. Perhaps it's better if you complete its main features - a Minimum Viable Product (what makes steemthink unique) before submitting further dev't contributions.
3. I checked the commit history:
* Merge pull request #3 from WayneChou1/master
- Most of the codes changes were PR from WayneChou1/master - is this you or another developer?
* 优化点赞
- if it's possible, make your commit comments in English.

If you think this decision was a mistake, please feel free to contact my supervisor (Amos#4622) in discord.

You can contact us on Discord.
[utopian-moderator]

@utopian.tip | March 17, 2018, 12:23 p.m. | Votes: 0 | [ VOTE ]

Hey @eastmael, I just gave you a tip for your hard work on moderation. Upvote this comment to support the utopian moderators and increase your future rewards!

@steemthinkcom | March 18, 2018, 9:49 a.m. | Votes: 1 | [ VOTE ]
  1. WayneChou1 is a developer in our team.
  2. For the next commit, I will use English.
  3. Since we have not yet tested the data, we have directly referenced the data on steemit.
[ BACK TO TRENDING ] [ BACK TO MENU ]
CMD>