小编Tim*_*m J的帖子

以编程方式设置约束优先级

我需要以.xib编程方式重新创建基于布局的布局。

我在很大程度上能够实现这一点,但是,无法设置我的一位主播的优先级。

我试图在代码中重现的设置是:

xib 约束

我以为我可以设置它,setContentHuggingPriority(.init(999), for: .vertical)但这没有效果。

如何在代码中定位此属性?

autolayout nslayoutconstraint swift

8
推荐指数
1
解决办法
7268
查看次数

FaceID 应该回退到密码,但没有

我继承了一个代码库,其中包含以下类,提供对 Face/Touch ID 的支持。

预期的行为是,在 Face/Touch ID 成功后,用户就会登录。这是有效的。

但是,如果用户未能通过 Face ID 并选择输入密码,则一旦调用完成处理程序,他们就会退出。我相信选择使用密码会触发

else {
 self.authState = .unauthenticated
 completion(.unauthenticated)
}
Run Code Online (Sandbox Code Playgroud)

如何触发密码提示?我应该使用它来创建第二个策略LAPolicy.deviceOwnerAuthentication并对其进行评估吗?

import LocalAuthentication

public enum AuthenticationState {
    case unknown
    case authenticated
    case unauthenticated

    public func isAuthenticated() -> Bool {
        return self == .authenticated
    }
}

public protocol TouchIDAuthenticatorType {
    var authState: AuthenticationState { get }
    func authenticate(reason: String, completion: @escaping (AuthenticationState) -> Void) -> Void
    func removeAuthentication() -> Void
}

public protocol LAContextType: class {
    func canEvaluatePolicy(_ policy: LAPolicy, …
Run Code Online (Sandbox Code Playgroud)

ios touch-id swift localauthentication face-id

6
推荐指数
1
解决办法
5850
查看次数

使用具有 API 响应的泛型 / Codable 204 NO CONTENT

我正在使用泛型和可编码的URLSession.

当我收到来自 API 的响应时,我检查状态是否在 200 - 299 范围内并像这样解码数据

        guard let data = data, let value = try? JSONDecoder().decode(T.self, from: data) else {
            return completion(.error("Could not decode JSON response"))
        }
        completion(.success(value)) 
Run Code Online (Sandbox Code Playgroud)

然后将其传递给完成处理程序,一切正常。

我有一个新的端点,我也必须 POST,但是,这个端点返回一个没有内容正文的 204。

因此,我无法解码响应,只是因为我无法传入类型?

我的完成处理程序期望

enum Either<T> {
    case success(T)
    case error(String?)
}
Run Code Online (Sandbox Code Playgroud)

并像这样打开我的响应状态代码

   case 204:
        let value = String(stringLiteral: "no content")
        return completion(.success(value))
Run Code Online (Sandbox Code Playgroud)

产生错误

“Either< > ”中的成员“success”产生“Either”类型的结果,但上下文需要“Either< >”

我的 APIClient 是

protocol APIClientProtocol: class {
    var task: URLSessionDataTask { get set }
    var session: SessionProtocol …
Run Code Online (Sandbox Code Playgroud)

nsurlsession swift urlsession codable jsondecoder

5
推荐指数
1
解决办法
951
查看次数

如何在从带有翠鸟的URL加载图像后调整UIImageView的大小

我想调整任何下载的图像的大小,以便它们保持纵横比,但是UITableViewCell它们都与渲染它们一样宽.

我的UIImageView配置了contentModeas AspectFit,我的单元格上有以下锚点:

在此输入图像描述

当前的尝试几乎就在那里:

class AnimatedImageTableViewCell: UITableViewCell {
    @IBOutlet weak var gifView: AnimatedImageView!
    @IBOutlet weak var imageHeightAnchor: NSLayoutConstraint!

    var refreshCell: (() -> Void)?

    func render(imageUrl: String) {
        guard let url = URL(string: imageUrl) else { return }

        gifView.kf.setImage(with: url) { result in
            switch result {
            case .success(let value):
                let ratio = value.image.size.width / value.image.size.height
                let newHeight = self.gifView.frame.width / ratio
                self.imageHeightAnchor.constant = newHeight
                self.refreshCell?()
            case .failure(let error):
                print(error) // The error happens
            }
        }
    } …
Run Code Online (Sandbox Code Playgroud)

uitableview uiimageview swift kingfisher

5
推荐指数
1
解决办法
418
查看次数

如果我通知操作已完成,是否应该使用 PublishSubject?

我正在学习Viperw/ RxSwift

我想通知我PresenterviewDidLoad我的ViewController.

为此,我有以下几点:

class LoginPresenter {

    weak var view: LoginView?
    var interactor: LoginUseCase?
    var router: LoginRouter?

    private(set) var viewDidLoad = PublishSubject<Void>()

    private lazy var disposeBag = DisposeBag()

    required init(view: LoginView?, interactor: LoginUseCase?, router: LoginRouter?) {
        self.view = view
        self.interactor = interactor
        self.router = router

        viewDidLoad
            .subscribe(onNext: { _ in
                // do something on viewDidLoad
            }).disposed(by: disposeBag)
    }
}
Run Code Online (Sandbox Code Playgroud)
class LoginViewController: UIViewController {

    var presenter: LoginPresenter?

    override func viewDidLoad() {
        super.viewDidLoad() …
Run Code Online (Sandbox Code Playgroud)

ios swift rx-swift viper-architecture

5
推荐指数
1
解决办法
435
查看次数

RxSwift 主题在调用时不触发事件

我有一个使用MVPCoordinator模式的应用程序。

当子协调器发送事件时,我希望AppCoordinator递归调用一个方法,该方法根据某些SessionState.

该应用程序的基本流程如下 -

AppCoordinator

  1. start()coordinateToRoot以初始状态调用
  2. 订阅showStartScene()启动子协调器

StartCoordinator

  1. start()创建MVP现在对用户可见的模块
  2. MVP模块调用AuthSvc对 iDP 进行异步调用并确认身份验证状态
  3. AppCoordinator完成此任务后,发布一个事件,该事件由的方法中的订阅拾取coordinateToRoot,并使用视图状态的适当协调器重复该循环。

然而问题是,在该事件发布后,什么也没有发生。start()没有显示它收到了事件并且coordinateToRoot不会再次被调用。

我在下面创建了最基本的版本来演示这一点。我还硬编码showStartScene为返回.signedIn而不是查找身份验证状态。

在下面的示例中,我希望一旦加载视图,presenter.signal应该立即发出一个导致打印语句显示的事件。

会话状态

enum SessionState: String {
    case unknown, signedIn, signedOut
}
Run Code Online (Sandbox Code Playgroud)

应用程序协调员

final class AppCoordinator: BaseCoordinator<Void> {

    private let window: UIWindow

    init(window: UIWindow) {
        self.window = window
    }

    override func start() -> Observable<Void> { …
Run Code Online (Sandbox Code Playgroud)

swift rx-swift publishsubject coordinator-pattern

5
推荐指数
1
解决办法
1934
查看次数

如何检查子视图控制器是否存在

我正在实现样式菜单中的幻灯片。

菜单在显示时添加为子视图控制器,然后动画显示到视图中。然后,在关闭后我将其从视图中删除。

我想引入一个,UIPanGestureRecognizer以便用户可以将其滑动到视图中,但是添加视图的逻辑仅在按下打开时才会触发。

我想避免在每个手势上多次添加它,所以我想检查它是否存在,如果不添加它,则设置动画。

惰性变量 menuController = MenuController()

private var menuWidth: CGFloat = 300
private let keyWindow = UIApplication.shared.keyWindow

override func viewDidLoad() {
    super.viewDidLoad()

    setupNavigationItems()
    setupTableView()

    menuController.view.frame = CGRect(x: -menuWidth, y: 0, width: menuWidth, height: view.frame.height)

    let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan))
    view.addGestureRecognizer(panGesture)

}

@objc func handlePan(gesture: UIPanGestureRecognizer) {


    let translation = gesture.translation(in: view)
    let transform = CGAffineTransform(translationX: translation.x, y: 0)
    menuController.view.transform = transform
    navigationController?.view.transform = transform

}

@objc func handleOpen() {
    keyWindow?.addSubview(menuController.view)
    animateMenuController(transform: CGAffineTransform(translationX: self.menuWidth, y: …
Run Code Online (Sandbox Code Playgroud)

uiviewcontroller ios swift

3
推荐指数
1
解决办法
5370
查看次数

HTML 视频标签不会在重新渲染时更新源代码

我有一个渲染 2 个<video>元素的 react 组件。

在任何时候只有 1 个元素是可见的,并且有一些更新状态的逻辑,所以这些切换。

我有一个 id 数组,在每次渲染状态/播放器切换时,我想用随机视频更新正在播放的视频。

(为了这个问题,我添加了一个按钮来切换状态)

如果我在渲染方法中注销我的状态,我可以看到url道具按预期更新,但是视频不会更改源。

我选择visibility将元素的切换为display:none或类似的

{playerOne.visible &&
    <LandingPageVideoPlayer url={playerOne.url} />
}
Run Code Online (Sandbox Code Playgroud)

重新渲染状态时会导致闪烁。

我不知道如何在重新渲染时更改视频元素的来源。

成分

const LandingPageVideoPlayer = ({ url, isActive }) => {
  const playerClassName = `video-player ${isActive ? 'video-player--is-active' : null}`

  return (
    <video className={playerClassName} autoPlay loop muted>
      <source src={url} type='video/mp4' />
    </video>
  )
}
class LandingPage extends Component {

  MOCK_URL_SOURCE = [
    'ehZqNokVylyWk',
    'hDqq4LalRAUiQ',
    'yjTccXlnh6LXW',
    '3FjEPbKqEPhPpmC8uY',
    '3ohs7NLUXtNW98mtIQ'
  ]

  state = { …
Run Code Online (Sandbox Code Playgroud)

javascript html5-video reactjs

3
推荐指数
1
解决办法
1650
查看次数

测试 UIAlertController 是否已呈现

我有一个协议来允许我的 ViewController 呈现警报。

import UIKit

struct AlertableAction {
    var title: String
    var style: UIAlertAction.Style
    var result: Bool
}

protocol Alertable {
    func presentAlert(title: String?, message: String?, actions: [AlertableAction], completion: ((Bool) -> Void)?)
}

extension Alertable where Self: UIViewController {
    func presentAlert(title: String?, message: String?, actions: [AlertableAction], completion: ((Bool) -> Void)?) {
        let generator = UIImpactFeedbackGenerator(style: .medium)
        generator.impactOccurred()
        let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
        actions.forEach { action in
            alertController.addAction(UIAlertAction(title: action.title, style: action.style, handler: { _ in completion?(action.result) })) …
Run Code Online (Sandbox Code Playgroud)

xctest swift uialertcontroller

3
推荐指数
1
解决办法
2807
查看次数

如何断言在我的单元测试中调用了委托

我想根据我的演示者中的检查结果调用正确的委托方法。

在模拟了我IdentityProvider的返回 true 之后,我将如何编写一个测试来断言delegate?.userIsAuthenticated()被调用?

import Foundation
import InjectStory

protocol StartPresenterDelegate: class {
    func userIsAuthenticated()
    func userNeedsToAuthenticate()
}

class StartPresenter {
    weak var delegate: StartPresenterDelegate?
    weak var view: StartViewInterface!

    private lazy var identityProvider = Dependencies.identityProvider.inject()

    init(view: StartViewInterface) {
        self.view = view
    }

    private func checkUserAuthState() {
        if identityProvider.isAuthorized() {
            delegate?.userIsAuthenticated()
        } else {
            delegate?.userNeedsToAuthenticate()
        }
    }

}

extension StartPresenter: StartPresentation {
    func onViewDidLoad() {
        checkUserAuthState()
    }
}

extension StartPresenter {
    struct Dependencies {
        static let identityProvider = …
Run Code Online (Sandbox Code Playgroud)

ios xctest swift

1
推荐指数
1
解决办法
1683
查看次数

容器中的 Go API 未返回任何响应

我有一个使用 Mux 用 GO 编写的简单 API。

在本地运行时它可以工作,但是我正在尝试容器化这个应用程序。

我的main.go样子是这样的

package main

import (
    "net/http"
    "time"
    "log"
    "github.com/gorilla/mux"
    "github.com/<username>/tweet-media-api/controllers"
)

func main() {

    r := mux.NewRouter()

    c := controllers.Controller{}

    r.HandleFunc("/", c.BaseRoute()).Methods("GET")
    r.HandleFunc("/healthz", c.HealthzRoute()).Methods("GET")

    srv := &http.Server{
        Handler:      r,
        Addr:         "127.0.0.1:8080",
        WriteTimeout: 15 * time.Second,
        ReadTimeout:  15 * time.Second,
    }

    log.Fatal(srv.ListenAndServe())
}
Run Code Online (Sandbox Code Playgroud)

我的项目基本上是这样的

在此输入图像描述

我正在使用go version go1.11.4 darwin/amd64并且我的项目正在使用 go 模块。

我尝试创建一个多阶段,Dockerfile如下所示

# build stage
FROM golang:alpine AS build-env
ADD . /src
RUN apk update && apk upgrade && …
Run Code Online (Sandbox Code Playgroud)

go docker

0
推荐指数
1
解决办法
857
查看次数