自作アプリを作ってみた -アプリ名:hanagasaki- qiita

はじめに

自作アプリを作りましたので、画面毎の機能とコードを説明したいと思います。
今回、qiita 画面の機能とコードを説明が記載されています。

使用環境

● OS:macOS Big Sur 11.3.1
● Xcode:12.5
● Swift:5.4
● DB Browser for SQLite:3.12.1

//  QiitaViewController.swift
import UIKit

class QiitaViewController: BaseViewController {
   @IBOutlet weak var qiitaTableView: UITableView!
   
   let cellid = "cellid"
   
   var qiitas = [Qiita]()
   
   override func viewDidLoad() {
       super.viewDidLoad()
       addHeaderBar("Qiita",
                    UIBarButtonItem(image: #imageLiteral(resourceName: "bars_24"), style: .plain, target: self, action: #selector(tapHambugerMenu)),
                    UIBarButtonItem(image: #imageLiteral(resourceName: "qiitaicon"), style: .done, target: self, action: #selector(tapQiitaIcon)))
       qiitaTableView.delegate = self
       qiitaTableView.dataSource = self
       qiitaTableView.register(QiitaTableViewCell.self, forCellReuseIdentifier: cellid)
       getQiitaApi()
   }

   func getQiitaApi() {
       let page = 20
       guard let url = URL(string: "https://qiita.com/api/v2/items?page=1&per_page=\(page)") else {return}
       var request = URLRequest(url: url)
       request.httpMethod = "GET"
       let task = URLSession.shared.dataTask(with: url) { (data, response, err) in
           if let err = err {
               print("情報の取得に失敗しました。:", err)
               return
           }
           
           if let data = data {
               do {
                   //let json = try JSONSerialization.jsonObject(with: data, options: .fragmentsAllowed)
                   let qiita = try JSONDecoder().decode([Qiita].self, from: data)
                   self.qiitas = qiita
                   DispatchQueue.main.async {
                       self.qiitaTableView.reloadData()
                   }
                   print("json: ", qiita)
               } catch(let err) {
                   print("情報の取得に失敗しました。:", err)
               }
           }
       }
       task.resume()
   }
   
}

extension QiitaViewController: UITableViewDelegate, UITableViewDataSource {
   func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
       return qiitas.count
   }
   
   func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
       return 120
   }
   
   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       let cell = qiitaTableView.dequeueReusableCell(withIdentifier: cellid, for: indexPath) as! QiitaTableViewCell
       cell.qiita = qiitas[indexPath.row]
       cell.backgroundColor = .clear
       return cell
   }
   
   func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
       let url = URL(string: qiitas[indexPath.row].url)
       if UIApplication.shared.canOpenURL(url!) {
           UIApplication.shared.open(url!)
       }
   }
   
   
}
//  QiitaTableViewCell.swift
import UIKit

class QiitaTableViewCell: UITableViewCell {
   
   var qiita: Qiita? {
       didSet {
           bodyTextLabel.text = qiita?.title
           let url = URL(string: qiita?.user.profileImageUrl ?? "")
           do {
               let data = try Data(contentsOf: url!)
               let image = UIImage(data: data)
               userImageView.image = image
           }catch let err {
               print("Error : \(err.localizedDescription)")
           }
       }
   }
   
   let userImageView: UIImageView = {
      let iv = UIImageView()
       iv.contentMode = .scaleAspectFill
       iv.translatesAutoresizingMaskIntoConstraints = false
       iv.clipsToBounds = true
       return iv
   }()
   
   let bodyTextLabel: UILabel = {
       let label = UILabel()
       label.text = "something in here"
       label.font = .systemFont(ofSize: 15)
       label.translatesAutoresizingMaskIntoConstraints = false
       return label
   }()
   
   override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
       super.init(style: style, reuseIdentifier: reuseIdentifier)
       
       addSubview(userImageView)
       addSubview(bodyTextLabel)
       [
           userImageView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 10),
           userImageView.centerYAnchor.constraint(equalTo: centerYAnchor),
           userImageView.widthAnchor.constraint(equalToConstant: 50),
           userImageView.heightAnchor.constraint(equalToConstant: 50),
           
           bodyTextLabel.leadingAnchor.constraint(equalTo: userImageView.trailingAnchor, constant: 20),
           bodyTextLabel.centerYAnchor.constraint(equalTo: centerYAnchor),
           ].forEach{ $0.isActive = true }
       
       userImageView.layer.cornerRadius = 50 / 2
   }
   
   required init?(coder: NSCoder) {
       fatalError("init(coder:) has not been implemented")
   }
}

おわりに

最後まで読んで下さりありがとうございます。
次回は、card 画面の記事を投稿したいと思います。
この記事が何かの実装に参考になれば幸いです。

参考文献


この記事が気に入ったらサポートをしてみませんか?