我需要以.xib
编程方式重新创建基于布局的布局。
我在很大程度上能够实现这一点,但是,无法设置我的一位主播的优先级。
我试图在代码中重现的设置是:
我以为我可以设置它,setContentHuggingPriority(.init(999), for: .vertical)
但这没有效果。
如何在代码中定位此属性?
我继承了一个代码库,其中包含以下类,提供对 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) 我正在使用泛型和可编码的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) 我想调整任何下载的图像的大小,以便它们保持纵横比,但是UITableViewCell
它们都与渲染它们一样宽.
我的UIImageView配置了contentMode
as 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) 我正在学习Viper
w/ RxSwift
。
我想通知我Presenter
在viewDidLoad
我的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) 我有一个使用MVP
该Coordinator
模式的应用程序。
当子协调器发送事件时,我希望AppCoordinator
递归调用一个方法,该方法根据某些SessionState
.
该应用程序的基本流程如下 -
AppCoordinator
start()
coordinateToRoot
以初始状态调用showStartScene()
启动子协调器StartCoordinator
start()
创建MVP
现在对用户可见的模块MVP
模块调用AuthSvc
对 iDP 进行异步调用并确认身份验证状态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) 我正在实现样式菜单中的幻灯片。
菜单在显示时添加为子视图控制器,然后动画显示到视图中。然后,在关闭后我将其从视图中删除。
我想引入一个,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) 我有一个渲染 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) 我有一个协议来允许我的 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) 我想根据我的演示者中的检查结果调用正确的委托方法。
在模拟了我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) 我有一个使用 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) swift ×9
ios ×4
rx-swift ×2
xctest ×2
autolayout ×1
codable ×1
docker ×1
face-id ×1
go ×1
html5-video ×1
javascript ×1
jsondecoder ×1
kingfisher ×1
nsurlsession ×1
reactjs ×1
touch-id ×1
uiimageview ×1
uitableview ×1
urlsession ×1