Help us understand the problem. What is going on with this article?

Swift Error, メモのまとめ

RxSwift用gitignore

https://github.com/ReactiveX/RxSwift/blob/master/.gitignore

Pod を使えるようにする

-bash: pod: command not found

$ sudo gem install cocoapods
$ pod setup

参考

https://qiita.com/sachiko-kame/items/e832c6de3b8c2d803eb3

pip installが通らない

$ pod init
-bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby: bad interpreter: No such file or directory

解決策

$ sudo gem update --system
$ sudo gem uninstall cocoapods
$ sudo gem install -n /usr/local/bin cocoapods

無事通りました!

参考

http://okogecreate.hatenablog.com/entry/2018/02/04/141644

Xibのインスタンス化方法まとめ

Cocoa Touch Classを選択する.
https://medium.com/@shiba1014/xibとコードの紐付け方まとめ-200da7766306

https://qiita.com/orimomo/items/739faab9af856877ed8e

TabBar

https://logist3.com/swift-tabbarviewcontroller/

AppDelegate.swiftの最初のViewを定める

https://qiita.com/tomu28/items/4bb327a8f80c042e41a1

UISearchBarにキャンセルを加える

【Swift4】UISearchBarをNavigation Barに表示させる
https://qiita.com/orimomo/items/739faab9af856877ed8e
UISearchBarの基本
https://www.swift-study.com/uisearchbar-basic/

xibファイルでViewを作成してStoryboardで使用する方法

https://program-life.com/559
https://www.ukeyslabo.com/development/iosapplication/swift/how_to_use_xib/

Protocolごとにextensionで分けてコードを書く

https://dev.classmethod.jp/etc/protocol-extension-form/

delegateメソッドの使い所

ページ遷移などそのファイル(例えばXib)では処理が書けないものを他のファイルの委託する。
依頼元でprotocol, delegateを設定し、委託先でdelegateを受け、メソッドの内容を定義する。
https://qiita.com/narukun/items/326bd50a78cf34371169

Swiftの列挙型(enum)おさらい

https://qiita.com/hachinobu/items/392c96820588d1c03b0c
https://qiita.com/techiromen0/items/db034aae31445ac7cf1e

classとstaticの挙動の違い

https://qiita.com/shimesaba/items/dc976b3974cfb41bec0c

Codable

https://dev.classmethod.jp/smartphone/json-decoding-without-swiftyjson/

Swift4でナビゲーションバーの色を変更する

https://qiita.com/k0uhashi/items/0fb4a9e70f4fb11df2f7

.xibを用いたUITableViewCellの実装方法

https://qiita.com/ostk0069/items/8bd4173ff4f083e35951

ViewController.swift
class ViewController: UIViewController {
  @IBOutlet weak var tableView: UITableView!
  private let viewModel = ViewModel()
  private let disposeBag = DisposeBag()

  override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.register(UINib(nibName: "TableViewCell", bundle: nil), forCellReuseIdentifier: "TableViewCell")
    self.bindViewModel()
  }

    private func bindViewModel()
    {
      self.viewModel.list
        .bind(to: tableView.rx.items) { tableView, index, item in
          let cell: TableViewCell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell")! as! TableViewCell
          cell.textLabel?.text = item
        return cell
      }
      .disposed(by: disposeBag)
    }
}
ViewModel.swift
class ViewModel: UIViewController {
  let list = BehaviorRelay<Array>(value: ["1", "2", "3", "4", "5", "6", "7", "8"])

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

インスタンスかする際に以下のエラーが出る

以下のエラー

Missing argument for parameter 'from' in call when creating instance of Codable class

原因: init()が存在しなかった.
https://stackoverflow.com/questions/56828197/missing-argument-for-parameter-from-in-call-when-creating-instance-of-codable

NavigationBar, TabBarが灰色になってしまう

edgesForExtendedLayout = []
これが原因でした.

addSubViewしたらViewがNavigationBarの下に潜り込む

CGRect(x: 0, y: !isNavBarHidden() ? statusBarHeight() + navBarHeight() : statusBarHeight(), width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.width)

extension CameraViewController {
//    func viewWidth() -> CGFloat { return self.view.frame.width }
//    func viewHeight(includeNavBarHeight: Bool = true, includeStatusBarHeight: Bool = true) -> CGFloat {
//        return self.view.frame.height - (includeStatBarHeight ? statusBarHeight() : 0) - (includeNavBarHeight ? navBarHeight() : 0)
//    }
//
//    func navBarWidth() -> CGFloat { return self.navigationController?.navigationBar.frame.size.width ?? 0 }
    func navBarHeight() -> CGFloat { return self.navigationController?.navigationBar.frame.size.height ?? 0 }

//    func statusBarWidth() -> CGFloat { return UIApplication.shared.statusBarFrame.width }
    func statusBarHeight() -> CGFloat { return view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0 }

    func isNavBarHidden() -> Bool { return self.navigationController?.isNavigationBarHidden ?? true }
}

https://qiita.com/tc_minami/items/3676d63847c0caef5234
statusBarFrameはiOS13以降では廃止されているらしいので以下を参照した.
https://stackoverflow.com/questions/57023899/how-to-get-the-status-bar-height-in-ios-13

[UIKit][UILabel] 背景色、枠線、角丸の設定をするには?

https://swift.hiros-dot.net/?p=734

システムカラーを使う

self.label.layer.borderColor = UIColor(red: 0, green: 122 / 255, blue: 1, alpha: 1).cgColor

https://joyplot.com/documents/2016/11/06/ios-system-color/

Viewがフルスクリーンにならない

ViewのinspectorでPresentationをOver Full Screenに設定する。

カメラが利用できるかチェックする方法

https://qiita.com/clutch0330/items/b7bbf53eb49334df394c

アプリのアイコン設定

https://rara-world.com/swift-ios-app-icon/
https://blog.piyo.tech/posts/2018-09-24-make-mobile-app-icon/

AVFoundationのCameraを2回以上使おうとするとエラーが出る

error文:

Settings may not be re-used swift

原因: AVCapturePhotoSettingsは繰り返して使うことができないらしい。
解決: そのページを開くたびにイニシャライズしてあげるとよい。

// fields
var settings: AVCapturePhotoSettings! = nil

override func viewWillAppear(_ animated: Bool) {
  super.viewWillAppear(animated)
  if UIImagePickerController.isSourceTypeAvailable(.camera)
  {
    self.settings = .init()
    startCapture()
  }
}

[参考文献]
https://stackoverflow.com/questions/54084683/avcapturephotooutput-settings-may-not-be-reused

スプラッシュ画面生成

https://qiita.com/e9d26/items/26fab0bed16aec69d176

LaunchScreenの表示時間を変更する方法

https://qiita.com/e9d26/items/26fab0bed16aec69d176

選択された Cell の背景色を変更

https://qiita.com/colorrabbit/items/b0d071cc906574086ac4

Refresh(UIRefreshControl)

ViewController.swift
class ViewController: UIViewController {
  @IBOutlet weak var tableView: UITableView!
  fileprivate let refreshCtl = UIRefreshControl()

  override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.refreshControl = self.refreshCtl
    refreshCtl.addTarget(self, action: #selector(SearchViewController.refresh(sender:)), for: .valueChanged)
  }

  @objc func refresh(sender: UIRefreshControl) {
    print("refresh!")
    refreshCtl.endRefreshing()
  }
}

https://qiita.com/Howasuto/items/cc515fb11c7cacf7cb44

Segmented Controlの使い方

ViewController.swift
import UIKit

class SignViewController: UIViewController {

    @IBOutlet weak var segment: UISegmentedControl!
    let signUpVC = SignUpViewController.init(nibName: nil, bundle: nil)
    let loginVC = LoginViewController.init(nibName: nil, bundle: nil)


    @IBOutlet weak var segmentView: UIView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // UIViewを作ってその上にaddSubviewする
        self.segmentView.addSubview(signUpVC.view)
        self.segmentView.addSubview(loginVC.view)
        self.loginVC.view.isHidden = true
    }

    @IBAction func segmentButton(_ sender: Any) {
        switch (sender as AnyObject).selectedSegmentIndex {
        case 0:
            self.addFirstView()
        case 1:
            self.addSecondView()
        default:
            print("error")
        }
    }

    func addFirstView() {
        loginVC.view.isHidden = true
        signUpVC.view.isHidden = false
    }

    func addSecondView() {
        signUpVC.view.isHidden = true
        loginVC.view.isHidden = false
    }
}

参考
http://somen.site/2018/02/05/segmented-control%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9-swift4-0/

iOS13で、presentで画面遷移をした際に遷移前の画面に戻れてしまう問題

self.VC.modalPresentationStyle = .fullScreen

を設定する。
https://qiita.com/hiesiea/items/2884ebe22687ad639975

UIPickerView

https://i-app-tec.com/ios/uipickerview.html

UIPickerViewのはじめに表示する項目を指定

picker.selectRow(1, inComponent: 0, animated: true)

https://joyplot.com/documents/2017/03/21/swift-uipickerview/

コードでUILabelのテキストを中央寄せにする

self.lbl.textAlignment = NSTextAlignment.center

参考
https://qiita.com/osamu1203/items/c1f92aee94f37fb96116

Alamofireで非同期

https://qiita.com/kazuhirox/items/9ecb25bc238ad2d47ff0

RxSwiftでUIPickerViewのテキストをバインドする

        self.pickerView.rx.modelSelected(String.self)
            .map { strs in
                return strs.first!
            }
            .bind(to: self.ViewModel.old)
            .disposed(by: disposeBag)

参考
https://culumn.hatenablog.com/entry/2018/06/07/120000

protocolエラー

Type "xxx" does not confirm to protocol 'NSObjectProtocol

解決法

NSObjectを追加する

class xxx: NSObject, testDelegate {
}

参考

https://qiita.com/hajime-u/items/78b552803a02c76c63dd

tapでキーボードを下げる

ViewController.swift
override func viewDidLoad() {
    super.viewDidLoad()
    let singleTapGesture = UITapGestureRecognizer(target: self, action: #selector(singleTap(_:)))
    self.view.addGestureRecognizer(singleTapGesture)
}

@objc func singleTap(_ gesture: UITapGestureRecognizer){
    self.view.endEditing(true)
    return
}

RxSwiftのDebounceとThrottle

インクリメンタルサーチでAPIを叩きすぎないようにする際に使えそう。
https://qiita.com/dekatotoro/items/be22a241335382ecc16e

PodでインストールしたObjectiveCのライブラリをimportする

該当箇所

AppDelegate.swift
#import "????.h"

エラー文

Expected identifier in import declaration

試していること

Build SettingでObjective-Cのファイルを読み込めるように設定するところがある気がしてその周辺をいじっています。
ここに以下のような記述があったので、Objective-C Bridging Headerに関して調べてみる。

SDKのメインヘッダファイルをインポートする
現在のiOS SDKはObjective-Cでネイティブに記述されています。シンボルにアクセスするには、メインヘッダファイルをインポートする必要があります。 Swiftコードを含むプロジェクトで作業している場合は、Objective-C Bridging Headerでこのファイルをインポートする必要があります。詳細については、Appleのページ「Objective-CコードのSwiftへの移行 」を参照してください。

Objective-C Bridging Headerの欄がない

ここを参考にしながら、Build Settingsを見ていると、Swift Compiler - Code GenerationにObjective-C Bridging Headerがなかった。

解決しかけた

新しく.hファイルを作成すると出てきた。

上記の通りにしてもまだ読み込めなかったので、
ここに記載されているように、
BuildSettings→Search Paths→User Header Search PathsにPods/**を設定してみた。
しかしダメでした。。。

解決

AppDelegate.swiftでimportしようとしていたが、既にBridging-Header.swiftで読み込まれていた。
よって、AppDelegate.swiftのimport文をコメントアウトしたらビルド成功しました。

因みにimportは読み込みたいヘッダーファイルのLocationを設定しました。

Bridging-Header.swift
#import "KochavaTrackeriOS/Classes/KochavaTracker.h"

NavigationItemをコードで書く

ViewController.swift
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.setUpNav()
    }

    func setUpNav()
    {
        self.title = "Main"
        self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "遷移", style: UIBarButtonItem.Style.plain, target: self, action:#selector(self.move))
    }

    @objc func move(){
        let homeVC = HomeViewController.init(nibName: nil, bundle: nil)
        self.navigationController?.pushViewController(homeVC, animated: true)//遷移する
    }
}

参考

https://qiita.com/tojo/items/c773c15a3f5f59a3a7e1

カスタムセルのレイアウトが崩れる

原因

間違って下記のContent Viewにclassとidを設定してしまっていた
スクリーンショット 2019-11-30 22.34.56.png

参考

https://teratail.com/questions/132178

Imgaeの角を丸くする

ViewController.swift
image.layer.masksToBounds = true
image.layer.cornerRadius = image.bounds.width / 2

参考

https://www.ioscreator.com/tutorials/circular-image-view-ios-tutorial

tablecellのboerderを消す

ViewController.swift
cell.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: .greatestFiniteMagnitude)

SlideMenu

https://github.com/fukami421/SideMenu_Learning
動きが鈍いところがありますが作ってみました

参考

https://qiita.com/takehiro224/items/dc5903ae42f288ccd5f7
https://qiita.com/a_jike/items/7ef99bbc9e69c73353f7

小数点を切り捨て、切り上げ、四捨五入し整数にする方法

double型を100倍して小数第1桁まで表示する

let percentage = floor(output.classLabelProbs[classLbl]! * 1000) / 10

参考

https://program-life.com/768

NavigationItemにBar Buttonをつける

Navigation ItemにButtonを挿入すると、Left Bar ButtonとRight Bar Buttonが使えるようになる。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away